Cejuno Frameworkの「核」Entity
Cejuno FrameworkにおけるEntityは、「システムが扱う情報のまとまり」を定義する最小単位です。
この例では、Member という名前のEntityとして、会員情報に関するあらゆる要素がひとつのXMLの中に集約されています。
3-1. Entityコンフィグ(抜粋)
<Entity Name="Member" DataSourceName="DefaultDB" DataSourceURL="" MultiLanguage="false">
<Property Key="MemberID" Required="true" Type="Normal" TypeOption="">
<Database>
<Column Name="MemberID" Type="int" Length="10" Default="" Attribute="unsigned zerofill" Null="false" Index="primary key" PrimaryKeyType="auto" />
</Database>
<Form Type="text">
</Form>
<TableDataConfig View="Normal" Class="" Style="">
<Parameter Key="width" Value="120" />
</TableDataConfig>
<Comment></Comment>
</Property>
<Property Key="MemberFamilyName" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberFamilyName" Type="varchar" Length="90" Default="null" Attribute="" Null="false" Index="index" />
</Database>
<Form Type="text">
<Parameters>
<Parameter Key="size" Value="20" />
</Parameters>
</Form>
<TableDataConfig View="Normal" Class="" Style="">
<Parameter Key="IsLink" Value="true" />
<Parameter Key="Path" Value="./view.php" />
<Parameter Key="RelationKey" Value="MemberID" />
<Parameter Key="Key" Value="MemberID" />
<Parameter Key="KeyList" Value="MemberFamilyName,MemberFirstName" />
<Parameter Key="width" Value="120" />
<Parameter Key="Separator" Value=" " />
</TableDataConfig>
<Comment></Comment>
</Property>
<Property Key="MemberFirstName" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberFirstName" Type="varchar" Length="90" Default="null" Attribute="" Null="true" Index="index" />
</Database>
<Form Type="text">
<Parameters>
<Parameter Key="size" Value="20" />
</Parameters>
</Form>
<Comment></Comment>
</Property>
<Property Key="MemberEMail" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberEMail" Type="varchar" Length="255" Default="" Attribute="" Null="false" Index="unique" />
</Database>
<Form Type="text">
<Parameters>
<Parameter Key="size" Value="30" />
<Parameter Key="placeholder" Value="PH_EMail" />
</Parameters>
<Description Key="DESCRIPTION_EMAIL">
</Description>
</Form>
<TableDataConfig View="Normal" Class="" Style="">
<Parameter Key="width" Value="250" />
</TableDataConfig>
<Comment></Comment>
</Property>
<Property Key="MemberEMailConfirm" Required="true" Type="Confirm" TypeOption="" Lang="false">
<Form Type="text">
<Parameters>
<Parameter Key="size" Value="30" />
<Parameter Key="placeholder" Value="PH_EMail" />
</Parameters>
<Description Key="DESCRIPTION_EMAIL_CONFIRM">
</Description>
</Form>
<Comment></Comment>
</Property>
<Property Key="MemberPassword" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberPassword" Type="varchar" Length="20" Default="" Attribute="" Null="false" Index="" />
</Database>
<Form Type="password">
<Parameters>
<Parameter Key="size" Value="10" />
</Parameters>
<Description Key="DESCRIPTION_PASSWORD">
<Replace Key="min" Value="6" />
<Replace Key="max" Value="20" />
</Description>
</Form>
<Comment></Comment>
</Property>
<Property Key="MemberPasswordConfirm" Required="true" Type="Confirm" TypeOption="" Lang="false">
<Form Type="password">
<Parameters>
<Parameter Key="size" Value="10" />
</Parameters>
<Description Key="DESCRIPTION_PASSWORD_CONFIRM">
</Description>
</Form>
<Comment></Comment>
</Property>
<Property Key="MemberSex" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberSex" Type="smallint" Length="" Default="0" Attribute="unsigned" Null="false" Index="index" />
</Database>
<Form Type="radio">
<Options>
<Option Key="DefaultValue" Value="1" />
<Option Key="DataSourceType" Value="Variable" />
<Option Key="DataSource" Value="SEX" />
</Options>
</Form>
<TableDataConfig View="Variable" Class="" Style="">
<Parameter Key="width" Value="80" />
</TableDataConfig>
<Comment></Comment>
</Property>
<Property Key="MemberBirthday" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberBirthday" Type="date" Length="" Default="" Attribute="" Null="false" Index="index" />
</Database>
<Form Type="date">
<Options>
<Option Key="DefaultValue" Value="1977-01-01" />
</Options>
</Form>
<TableDataConfig View="Normal" Class="" Style="">
<Parameter Key="width" Value="100" />
</TableDataConfig>
<Comment></Comment>
</Property>
<Property Key="MemberZip" Required="false" Type="NumberJoint" TypeOption="2" Lang="false">
<SubKey Value="MemberZip1" />
<SubKey Value="MemberZip2" />
<Parameter Key="Separator" Value="LABEL_HYPHEN" />
<Database>
<Column Name="MemberZip1" Type="char" Length="3" Default="null" Attribute="" Null="true" Index="index" />
<Column Name="MemberZip2" Type="char" Length="4" Default="null" Attribute="" Null="true" Index="index" />
</Database>
<Form Type="text">
<Options>
<Option Key="Attribute" Value="size:1/minlength:3/maxlength:3|size:2/minlength:4/maxlength:4/onKeyUp:setAddress('inputForm', 'Member');" /><Option Key="Separator" Value="FORM_SEPARATOR_HYPHEN" />
</Options>
</Form>
<Comment></Comment>
</Property>
<Property Key="MemberPrefecture" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberPrefecture" Type="smallint" Length="" Default="0" Attribute="unsigned" Null="true" Index="index" />
</Database>
<Form Type="select">
<Options>
<Option Key="Append" Value="MSG_PLEASE_CHOOSE" />
<Option Key="SearchAppend" Value="LABEL_UNSELECTED" />
<Option Key="DataSourceType" Value="Variable" />
<Option Key="DataSource" Value="PREFECTURE" />
</Options>
</Form>
<TableDataConfig View="Variable" Class="" Style="">
<Parameter Key="width" Value="90" />
</TableDataConfig>
<Comment></Comment>
</Property>
:
:
:
<Property Key="MemberShipping" Required="true" Type="Normal" TypeOption="" Lang="false">
<Database>
<Column Name="MemberShipping" Type="text" Length="" Default="null" Attribute="" Null="false" Index="" />
</Database>
<Form Type="class">
<Options>
<Option Key="Type" Value="Shopping" />
<Option Key="Package" Value="member" />
<Option Key="Class" Value="MemberShippingForm" />
</Options>
</Form>
<Comment></Comment>
</Property>
<ViewConfig>
<View Type="List" Kind="client/admin/member/index">
<Parameter Key="Element" Value="table" />
</View>
</ViewConfig>
</Entity>
Property要素
このEntity要素の中に、会員ID、氏名、メールアドレス、パスワード、性別、生年月日、住所といった「項目=Property」が並び、それぞれの項目に対して
- データベース上のカラム定義(Database)
- 入力フォームの種類や属性(Form)
- 一覧画面などでの表示設定(TableDataConfig)
- 必要に応じた表示オプションや説明文(Parameters, Options, Description)
Propertyごとに「DB」「フォーム」「一覧表示」を一括定義
例えば、会員IDであるMemberIDの定義では、
- int(10) unsigned zerofillの主キーとして扱うこと
- フォーム上ではtext入力として使うこと
- 一覧表示用には幅120pxで表示すること
同じように、MemberFamilyNameやMemberFirstNameではテキストボックスのサイズや、一覧画面で氏名をリンクにするためのパラメータ(IsLink, Path, RelationKeyなど)が設定されており、「どの画面でどう表示され、どの値をキーにリンクするのか」までがXMLだけで完結しています。
Confirm項目や結合項目もXMLだけで表現
MemberEMailConfirmやMemberPasswordConfirmのような「確認用」入力は、データベースのカラムを持たず、Type="Confirm"としてフォーム側だけを定義しています。
これにより、「どの項目と照合するか」「どのバリデーションルールを適用するか」といったロジックをEntityValidation側と連携させつつ、画面定義はシンプルに保てます。
また、MemberZipはType="NumberJoint"として定義されており、郵便番号をMemberZip1とMemberZip2の2つのカラムに分けつつ、フォーム上ではひとつの項目として扱う構造になっています。
ここでは、
- DB上は2カラム
- 画面上は連結された1つの入力(ハイフン付き)
- 入力完了時に住所自動補完処理を呼び出す
マスタ連動や複合フォームも一元化
MemberSexやMemberPrefectureでは、ラジオボタンやセレクトボックスの選択肢を「DataSourseType」と「DataSrouce」といった形で外部のデータソース(例えば定数定義やマスタ)に紐付けています。
これにより、「性別マスタ」や「都道府県マスタ」を変更しても、EntityXMLを書き換えることなく選択肢を更新できるようになっています。
さらにMemberShippingのように、Form Type="class"とすることで、特定の項目だけを専用フォームクラス(Shopping/member/MemberShippingFormなど)に委譲し、複雑なUIや専用ロジックを組み込むことも可能です。
ViewConfigによる画面単位の設定
最後のViewConfigでは、どの画面(ここではclient/admin/member/index)で、どのような要素構造(Element="table")を用いて表示するのかを定義しています。
この設定と各PropertyのTableDataConfigが組み合わさることで、一覧画面が自動的に構成されます。
EntityコンフィグがCejunoの「核」である理由
このように、Entityコンフィグは
- データベース構造
- 入力フォームのレイアウトと振る舞い
- 一覧画面での表示方法
- マスタ連動や複合項目の扱い
- 一部項目の専用フォームクラスへの委譲
Cejuno Frameworkにおいては、このEntityコンフィグが「情報の設計図」として機能し、WorkflowやTask、PageViewerと連携することで、DB定義から画面生成、業務処理までの大部分を自動化します。
つまり、
「Entityをどう設計するかが、そのままシステム全体の“情報構造”を決める」
と言ってよいほど、Cejuno FrameworkにおけるEntityは中核的な存在です。
他フレームワークとの違い
Cejuno Frameworkと他フレームワークの違いは、
”情報そのもの”を1つの場所で完全に定義できることです。
通常のフレームワークでは
- DB定義
- フォーム定義
- 一覧表示の設定
- バリデーション設定
- ラベルやプレースホルダ
- UIの振る舞い
しかし、Cejuno Frameworkでは全てが1つのXML内にまとまっています。
これは“情報工学的にも”、“哲学的にも”正しく、
「情報の定義は1か所にあるべき」
この原則を実現したEntityは、まさに“核”となります。
また、他フレームワークとの大きな違いとして、DBとUIの乖離を完全にゼロにできるという特徴があります。
通常のフレームワークでは
- DBカラムを変える
- 入力フォームを直す
- 一覧画面を直す
- バリデーションを直す
しかし、Cejuno FrameworkのEntityでは、XMLの該当箇所を直すだけで、
- DB
- 入力フォーム
- 表示
- 検索
- Task処理
- PageViewer
これは“世界中のフレームワークが解決できていない問題”を、Cejuno Frameworkがあっさり突破している現実を意味します。