メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupal8ホストなりすまし攻撃防止(Host Header Spoofing)と設定方法

Drupal8ホストなりすまし攻撃防止(Host Header Spoofing)と設定方法

drupal
system_management
configuration

Drupal8をインストール後にサイト状態(Site Status)ではエラーがあります

  • Drupal8をインストールして、ホーム >> 管理 >> レポート >> サイトの状態 を確認すると、以下のエラーがあります
    TRUSTED HOST SETTINGS無効
    
    The trusted_host_patterns setting is not configured in settings.php. 
    This can lead to security vulnerabilities. It is highly recommended 
    that you configure this. See Protecting against HTTP HOST Header 
    attacks for more information.

    Trust Host Seetingエラー
  • このエラーの原因はサイトの設定ファイルで「TRUSTED HOST SETTINGS」を定義していないからです

Drupal8のホストのなりすまし攻撃(Host Header Spoofing)防止のため信用ホストを登録する

  • ホストのなりすまし攻撃(Host Header Spoofing)が最近よく見られてきました
  • Drupal8では「symfony trusted host mechanism」の仕組みを利用して信用ホストを登録して、攻撃を防衛します
  • 登録場所はサイトの設定ファイル(drupal/sites/[site-name]/settings.php)で行います

サイトの設定ファイルで信用ホスト名を登録します

  • サイト単位の設定ファイル(drupal/sites/[site-name]/settings.php)を開くと、687行あたりで、信用ホスト登録の説明、サンプルがあります
  • 信用ホスト登録例をコピーして、開発環境、実際に利用するホスト名を正規表現で登録します
      $settings['trusted_host_patterns'] = array(
        '^localhost$',
        '^www.\your-host\.jp$',
      );

     

drupal
module usage

やりたいこと:Drupalのコンテンツタイプ定義を出力して別のサイトにインポートします

  • 背景:Drupal8.3.2
  • Drupal8のコンテンツタイプの定義をCMI(Configuration Managementモジュール、Drupal8のコアーにある)でエクスポートします(ほかのサイトにインポートのため)。
    • シングルタイプのエクスポート: ホーム >> 管理 >> 環境設定 >> 開発 >> 同期 >> エクスポート >> シングルアイテム で行います
    • 構成タイプ:コンテンツタイプ
    • 設定名:エクスポートしたいコンテンツタイプ名を選択します
  • エクスポートされたコンテンツタイプの定義を見てみると、フィールドの情報がありませんでした。
    Drupal8のコンテンツタイプをCMIでエクスポート時にフィールド情報がありません

Durpal8のCMIがコンテンツタイプとコンテンツフィールドが別物として扱われているため、コンテンツタイプとフィールドを一緒にエクスポートはできません

  • CMIの構成タイプを見てみると、「フィールドのストレージ」項目がありまして、これはすべてのコンテンツタイプのフィールドを纏めて表示されています
  • CMIはコンテンツタイプがフィールドと関連付けていないようで、別物として扱っています
  • フィールドの情報をエクスポートしたい場合、一つ一つ個別でエクスポートする必要があるようです

コンテンツタイプをフィールドと一緒にエクスポートしたい場合にモジュール(Feature)を利用します

  • モジュール(Feature)を利用してコンテンツタイプをフィールド情報と一緒にエクスポートすることができます
  • モジュールインストール方法で出力っされたコンテンツタイプをインストールすればそのコンテンツタイプの復元ができます
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
taxonomy
field

タクソノミー・タームの選択ツールについて

  • 記事編集画面でタクソノミー・ターム(例:タグ)などの初期選択ツールが自動補完/セレクトボックスなどがあります
  • Drupal7では:Hierarchical Select モジュールをよく使用しました。
    • とてもシンプルとは言えないですが、使いやすいモジュールでした
    • 選択だけではなく、新規タームの作成もできました
  • Drupal8では: Hierachical SelectモジュールはDrupal8のバージョンを提供していない
    • Drupal8では、Simple Hierarchical Select, Chosen などのモジュールがあります
    • 階層別で選択では、Simple Hierachical Selectでは十分機能しています
    • Chosenはサードパーティーのモジュールで、jsライブラリのダウンロード/インストールが必要です

モジュール(Simple Hierachical Select)が使いやすいが問題があり

  • 現時点では、Simple Hierachical Selectモジュールのバージョン:8.x-1.0-alpha4
  • モジュールを通常にインストールして、設定画面で、新規ターム作成許可のチェックボックスが無効化されています
    新規ターム作成チェックボックスが無効されている
  • この点をインターネットで調べてみたら、実際に解決されていない問題があります
    • 詳細説明ページ:https://www.drupal.org/project/shs/issues/2712115
    • パッチ幾つかが提供されていますが、根本的な対応策が見つかっていないようです
    • でも、ターム新規作成をしなければ、このモジュールが十分使えます
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
customization
drupal
content type
entity type

Drupal7の基本

  • Drupal7の初期コンポーネントはいくつかしかない
    • Content Type: Article ⇒ 記事の構造(コメント機能、例Blogの構造)、Basic Page ⇒ Articleと似ている、単純的なページの機能(コメント機能なし、ほかにはArticleと同じ)
    • Taxonomy: タグをつける機能。データのツリー構造、キーワード/タグとして、記事の纏めに役に立つ
    • People: ユーザーのプロファイル、ログイン、アクセス権限などに利用される
    • Menu: メニューの構成を管理する
    • Block: ページの構成、コンテンツがどこに表示するかなどの管理
    • Appearance: サイト全体の構成、テーマ、表示などの管理
    • その他
  • 記事などのデータ/コンテンツ管理は:Content Type、Taxonomy、Peopleなど
  • 記事などのデータ/コンテンツの表示管理は:Menu、Block、Appearenceなど
  • 上記機能だけで、簡単なウェブサイト構築が可能となる

Contentsについて

  • ウェブページ上に表示されている内容がコンテンツです <- エンドユーザーからの視点から見る
    • コンテンツがContents Type(同じフィールドを持ち)に分類され、一つのコンテンツ・タイプが複数のコンテンツから構成されます。
  • 一つウェブサイトに複数のコンテンツ・タイプがあります。
    • Drupal7の初期コンテンツタイプ:Article、Basic Page。ほかにBook Page、Forum topic、Pollなどがインストールされている(無効化されている)
    • ユーザーが必要なフィールド及びフィールドの入力/表示方式を決めて、新しいコンテンツタイプの作成が出来る
    • コンテンツタイプにある各フィールド、フィールドの入力制御、フィールドの表示などを管理するルーツCCK(Content Constructuion Kit)がDrupal7に初期インストールされている

Nodeについて

  • Drupal での重要なコンセプトは、すべてのContentsをノードとして保管するということです。
  • Nodeはシステムの基本ビルディング・ブロックで、これを基礎としてDrupal に保管されたコンテンツを拡張します。
  • 開発者は新しいノード・モジュールを作成することによって、それぞれのサイトのニーズに特有の追加フィールドをデータベースに定義し、保管できます。
  • Nodeはタイプによって分類されます。各ノード・タイプの操作とレンダリング方法は、そのユース・ケースに基づいて変えることができます。
  • 標準ノード・タイプには、以下のものが含まれます。
    • ページ (Pages): コンテンツを表示するためのシンプルなノード。PHP を使用して、コンテンツを動的に更新できます。コンテンツのどの部分でも、PHPを組み込むことによって動的にすることができます。
    • ブログ・エントリー (Blog entry): オンライン・ジャーナルやウェブログを保持するノード。
    • フォーラム (Forum): ノードとそれぞれのコメントのセット。これらのノードは、タクソノミー (taxonomy:分類方法) を割り当てることによってグループ化されます。
    • ストーリー (Story): 一定の日付が過ぎると期限切れになる汎用ページ。通常のページと同様ですが、スタイルを変えることができます。
    • コメント (Comment): 特殊なタイプのコンテンツで、他のノードで定義されたコンテンツに関するコメントをユーザーが追加できます。コメントはノードのタイプではないため、データベースの別個のテーブルに保管されます。
  • データベースは、Nodeに関する基本的な情報一式を記録します。
    • この情報には、タイトル、簡単な記述(または要約)、および本文が含まれます。
    • 作成者、作成時間、ステータスに関する情報も記録されます。通常、アプリケーションに必要な情報を追加するには、新しいノード・タイプを作成し、そのノード・タイプに対して明確に定義されたデータベース・テーブルに書き込む必要があります。
  • Drupal は、ノード・コンテンツに加えられた変更に対応するためのリビジョン・システムをインプリメントします。モジュール開発者はこのシステムを使用して、ノード・リビジョン専用に割り振られたテーブル内のそれぞれのノード更新に対する新規データベース・レコードを切り取ることができます。詳細は、Drupal revisions overhaul に記載されています。
  • 詳細な説明はここです。

Entityについて

  • Drupal7ではContent TypeがNodesとも言われている:いろいろなコンテンツがNodesの扱いとなる
    • Nodes: すべてのコンテンツをノードとして保管するということです。ページ、アンケート、記事、フォーラム、Blogなどを指している
    • CommentsがNodeではない。Commentsがいつもコンテンツ(例Articleなど)に付加されているし、単独な存在はしない。
    • Nodesの大きな特徴は、いろいろなフィールド(Text、image、Fileなど)が自由自在に追加されることができる。入力フォームと表示フォームの管理ができる。作成者、作成年月日などのプロパティがある。メニュー/表示管理ができる
  • Drupal7のEntityはユーザー、コメント、ノートなどの元となる概念
    • Drupal7 Dataで見ると以下のような構造となる
      • Custom Database table
      • Entity
        • User
        • Comment
        • File
        • Taxonomy Vocabulary
        • Taxonomy term
        • Node(・Page, ・Blog post, ・Articleなど)
      • Custom entity Type
  • Entityの構造はEntity Type、Entity、Bundleのようなもの
    • Entity Type: いろいろなコンテンツタイプ(Nodes (content), Comments, Taxonomy terms, User profiles)がEntity Typeの一種類となる
    • Entity: Entity Typeのインスタンス。
    • Entity Properties: Entity Typeの共通項目をプロパティで表現する(例:Content typeは作成者、作成日付、アクセス権限などがContent typeのプロパティとなる)
    • Bundles : 各Entity Typeで生成されたオブジェクトの束(例:車のEntityTypeに乗用車、トラック、救急車などのBundlesがある)
    • Fields: 各Entityに追加された項目(Entity Properties以外のもの、共通なものではない)

Entity と Nodesの違い

Nodes                          Entities

  • サイトにすでに存在                  オプションで追加
  • コンテンツ、フィールドなどをUIで追加       開発に利用することが多い、UIのサポートが少ない
  • バージョン管理でリリース              個人での管理
  • データがNodeテーブルに保存           データ保存の個人管理可能
  • 各ケースに必要のないパーツも削除できない  すべてのパーツが自由に組わせ、拡張性とパフォーマンスが良い
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
theme

Drupalのテーマレイヤー(theme layer)がロジック層(Logic)とプレゼンテーション層(Presentation)が徹底的に分離されています

  • 初心者として、Drupalのテーマに関するソースコードを読む時に、どこで定義して、どこから呼び出されているかは分からなく、理解するときに少し難しいかもしれないです。
  • この難しい構造は、実はロジック層とプレゼンテーション層をしっかり分けたせいかもしれません。
  • ロジック層とプレゼンテーション層を分離したメリットがいろいろあります
    • オーバーライトするのは簡単にあります(拡張性がよい)
    • 簡単に、どこでも呼び出すことができます
  • 抑えるポイントとしては:
    • テーマの登録
    • テーマの実装
    • テーマの呼び出し
      Drupalのテーマレイヤーのロジック層とプレゼンテーション層が分離されている

hook_themeの実装でテーマの定義を行います

  • 任一の場所で呼び出す可能にするため、テーマをシステム登録する必要があります
  • hook_theme()でテーマを登録します
    /**
     * Implements hook_theme().
     */
    function MODULE_NAME_theme(){
        return array(
            // function テーマの定義
            // 実装時に form_a の名前で
            'form_a' => array(    
                  'render element' => 'form_element' ,
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
            // template テーマの定義
            // 実装時に form_b の名前で
            'form_b' => array(
                 'template' =>  'form_temp' ,
                  'path' => "theme_dir", // テンプレートファイルのパス
                  'variables' => array('vars' => NULL),
                  ・・・・
            );
    
        );
    }
    
  • 登録内容は抽象的に、具体的になロジックはありません:
    • テーマの実装される名前(例:form_a/form_b)
    • テンプレートファイル名
    • テンプレートファイルのパス
    • 渡すパラメーター配列のキー
    • など(具体的にはAPIを参考)
  • テーマの定義を実装するのはファンクションか、テンプレートファイルか、2種類です

カスタム関数で(theme_ARRY_KEY)/テンプレートファイル(ARRY_KEY.tpl.php)でテーマ定義の実装

  • カスタム関数を新規作成して、テーマの定義を実装します
    • カスタム関数名: theme_ARRY_EKY :  ARRAY_KEYはロジック層の定義配列のキー(例:ARRY_KEY: form_a、 関数名:theme_form_a()  となります)
    • テーマ具体的な内容を定義します
      function theme_form_a(){
          return print( '<form method="get" ・・・・</form>') ;
      }
      
  • テンプレートファイルを作成して、テーマの定義を実装します
    • テンプレートファイル名: ARRY_KEY.tpl.php (例:ARRAY_KEY:form_b、テンプレートファイル名: form_b.tpl.php となります)
    • 上記同様にテーマの内容を定義します
      <-- HTMLでの出力  -->
      <form method="get">
        ・・・・
      </form>

theme()関数でパラメータを渡したり定義されたテーマを呼び出して出力します

  • どこかでtheme()関数でテーマにパラメータを渡して、HTMLコードを出力します
  • theme('ARRAY_KEY', array(パラメーター配列) )でテーマを呼び出し
    • ARRAY_KEY:テーマ定義の配列キー(例: form_a、 theme('form_a') となります)
    • パラメーター配列(例: array('vars' => 'some words') となります)
      //  form_a テーマの呼び出し
      $output = theme('form_a', array('var' => '1234'....) ) ;
      
      //  form_b テーマの呼び出し
      $output = theme('form_b', array('var' => '1234'....) ) ;
      

 

drupal
architecture
customization
theme

Drupalの構造は複雑で、簡単に説明が難しいです。ここで、いろいろな文書を参考しながら、いろいろな角度でDrupalの構造をまとめたいと思います。

Layerと処理フロー

  • Drupalがデータからプレゼンテーションまで、いくつかのレイヤーを分けることができます
  • データ: DBからノードなどの単位でデータを取得したら、DBにデータを保存するなどに構成されます
  • モジュール: コアモジュール/Contributeモジュール/Customモジュール(独自のモジュール)があります。ほとんどの機能、表示などを纏めて処理します。
  • ブロック/メニュー: 画面の表示場所と表示条件管理を行います
  • ユーザー権限: ユーザーの各コンテンツの新規作成、更新、削除、表示などの権限管理を行います
  • テンプレート: 画面に表示管理を行います(画面から、フィールドまでのテンプレート化ができます)

Hierarchical MVC

  • Drupalの構造はPAC(Presentation-Abstraction-Control model)、またはHierarchical MVCとは言われています。​
  • 簡単に言うと、階層化されたMVC構造です
  • トップレベルから各表示のフィールドまでMVC化することができます
  • この特徴はモジュールViews、Panelsなどを利用するとよくわかります。

モジュールは縦構造

  • もし、Drupalコーアの各機能(例:データ、ビジネスロジック、プレゼンテーションなど)を横構造であれば、各モジュールが縦構造となります
  • モジュール内でデータデータ取得、ビジネスロジック、プレゼンテーションなどの機能を独自に書くことができます。
  • モジュールがコアとの連携はhookか、コアの関数で行います。
    • コーアのコード変更は行わない。hookでオーバーライドするか、コアの関数でデータやり取りを行います
    • コアのロジックは絶対に書き換えないことです(書き換えたら、次回のアップデータする際に書き換えた部分が消えます)。
  • モジュールとモジュールの連携は、モジュールに提供されたAPIで行います。
    • モジュールに提供されたAPIはhookの形で操作します
    • モジュールがAPIを提供していなければ、通常は連携できないです。
    • モジュール内の関数を利用できる場合がありますが、注意深く利用する必要があります。

hookと関数の違い

  • hookは関数(function)です
  • hookを利用して独自なロジック/データ/形で元の機能をオーバーライドすることができります
    • 例:hook_form_alter()、既存のフォームに要素の追加、削除、変更ができます。
    • 元の機能/形を完全に変えることができます
  • 関数はコアの機能/データなどの設定、利用に使われます。

ノード(Node)から積立てたもの

  • Drupalがパズルのように一ピース一ピースで積立てたものと言われています
  • そのパズルの元はノード(Node)であります。
  • 複数のノードはコンテント(Content)となります。Drupalはコンテントの表示、入力、更新を管理します
  • Coreシステム、Theme、メニュー、ブロックなどはノードをサポートします
  • ModuleなどはCoreシステムをサポートします

 

drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
drupal
module
system_management

Drupal7と比較すると、Drupal8のノード(node)のデータテーブルこう構造が変わった

  • Drupal7ではノード(node)テーブルがタイトルが含まれています
    • タイトル、編集ユーザーなどがあります
  • Drupal8ではノード(node)テーブルがタイトルなどが含まないです
    • 単にノードID(nid)、リビジョンID(vid)のみの識別情報となります

Drupal8のリビジョン管理がnode_revisionテーブルで行います

  • ノード単位のリビジョンがnode、node_revisionテーブルで行います
    Drupal8ノードリビジョン管理
  • nodeテーブルでは、単にnid、vid、typeの管理
  • node_revisionテーブルでは、nid、vidのみでリビジョンを管理しています
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)