Stackとグローバルエリアのデータ構造(テーブルのリレーション)について

admin
admin

日本では、RDBMSを使ったWebアプリケーションを作る際は、必ずと言って良い程作成されるドキュメントに、ER図( Entity Relationship Diagram )という物があるのですが、何故かconcrete5では公開されていません。

concrete5では、主なオブジェクトをEAV(エンティティ・アトリビュート・バリュー)形式でデータベースに実装してあるのですが、上記の理由からどこにどの様にデータが保存されていて、どう関連付けられているのか?がなかなかわかりにくい事になっています。

とは言え、通常はそういったテーブル構造を意識せずともほとんどの事がconcrete5のAPIを使ってできてしまいますので、あまり意識する機会は多くありません。

でも、concrete5のAPIを使っても実現できない機能をカスタマイズして実装しないといけない場合は困ると思います。
なので今回はスタックとグローバルエリアがデータベース上でどう表現されているか?についてご説明します。

スタックもグローバルエリアも内部的にはCollection

実は、スタックもグローバルエリアも内部的にはほぼ同じものとして扱われています。

クラスの継承はこうなっているのですが、

Collection関連クラス継承図

データベース内では、Stacksというテーブルにスタックとグローバルエリア両方のレコードが存在しています。

ざっくりスタックとグローバルエリア関連のリレーションを表現すると、こんな感じになります。

スタック関連のER図

スタックは、Mainエリアだけを持つ特殊なCollection(ページ)と言えます。それをブロックとして表示する機能を持ったブロックが、Core Stack Displayブロックです。

このCore Display Blockを通常の他のブロックと同じ様に任意のエリアに配置する事によって、「全ページで同じ内容を表示するブロック」という機能を実現しています。

それに対し、グローバルエリアは「ブロックとして表示」ではなく、あくまで「エリアとして表示」するCollection(ページ)です。

GlobalArea::display()は、エリアハンドルからStacksを検索し、配置されているブロックを表示します。(グローバルエリアのstTypeStack::ST_TYPE_GLOBAL_AREA = 20になります)

尚、スタックのページタイプは内部的には"core_stack"という名前のページタイプが利用されており、コード上ではSTACKS_PAGE_TYPEという定数に値が割り当てられています。

スタックを表示しているのは、Core Stack Displayというコアブロック。

スタックをひとつのブロックとして表示しているのは、コアブロックのひとつである、Core Stack Displayというブロックになります。
コアブロックは、concrete5が内部的に利用するブロックなので、通常のブロックメニューには出てきません。でも、コードやDBの中身を見るとちゃんとブロックとして実装されています。

この、Core Stack Displayブロックがどのスタックを表示する様に設定されているか?を定義しているのが、btCoreStackDisplayというテーブルになります。
実はここにちょっとしたトラップがあり、btCoreStackDisplay.stID = Stacks.cIDなんですよ...

btCoreStackDisplay.stIDをキーにするなら対応するのはStacks.stIDだと思うじゃないですか?でもcIDなんです...(きっと実装ミスですね...)

なお、Core Stack DisplayブロックのブロックタイプID(btID)は4になります。

スタックやグローバルエリア内のブロックの情報はどこに?

では、スタックやグローバルエリアの中に、どんなブロックが入っているか?はどこにあるでしょう?

これも他のブロックと同様にCollectionVersionBlocksテーブルにレコードがあります。

ただ、通常のブロックの場合は「配置されているページのcIDと配置されているブロックのbID」がキーとして登録されているのに対し、グローバルエリアやスタックの中身の場合は、CollectionVersionBlocksには、「どのスタック(グローバルエリア)のcIDとどのブロックのbID」がキーとして登録されています。(Stacks.cID = CollectionVersionBlocks.cID)

まとめ:ブロックとグローバルエリアの違い

  • グローバルエリアが他のページ(Collection)を表示するエリア
  • スタックは他のページ(Collection)を表示するブロック
  • グローバルエリアの中にスタックは配置できるが、逆はできない。

 

 

concrete5のコアな専門的な知識がやカスタマイズが必要なときは

弊社ではconcrete5のコアにコミットしたり、こういったconcrete5の細かい込み入った知識や経験を常に積み上げています。

こんな知識や経験が必要な場合や、特殊なカスタマイズが必要な場合は、ぜひ弊社までお問合せください。