モデルクラスのバックエンドインターフェイスの作成には symfony のアドミンジェネレータを使います。ORM として Propel もしくは Doctrine が使われます。
作成
アドミンジェネレータモジュールを生成するには propel:generate-admin
もしくは doctrine:generate-admin
タスクを使います。
$ php symfony propel:generate-admin backend Article $ php symfony doctrine:generate-admin backend Article
上記の例では、Article
モデルクラスに対応した article
アドミンジェネレータモジュールが生成されます。
note
generator.yml
ファイルのキャッシュは PHP ファイルとして保存されます。処理は sfGeneratorConfigHandler
クラスにゆだねられます。
設定ファイル
モジュールのコンフィギュレーションを変更できる場所は apps/backend/modules/model/article/
ディレクトリに配置されている generator.yml
ファイルです。
generator: class: sfPropelGenerator param: # パラメータの配列
このファイルにはメインエントリが2つが用意されています (class
と param
)。class
エントリにセットされているデフォルトの値は、Propel の場合は sfPropelGenerator
で、Doctrine の場合は sfDoctrineGenerator
です。
param
エントリには生成モジュールのコンフィギュレーションオプションがとりそろえられています。model_class
オプションはこのモジュールに結びつけるモデルクラスを定義し、theme
オプションはデフォルトのテーマを定義します。
メインコンフィギュレーションを変更する場所は config
エントリの下側です。エントリは7つのセクションにわかれています。
actions
: リストとフォームで見つかるアクションのデフォルトコンフィギュレーションfields
: フィールドのデフォルトコンフィギュレーションlist
: リストのコンフィギュレーションfilter
: フィルタのコンフィギュレーションform
: 新規ページと編集フォームのコンフィギュレーションedit
: 編集ページ専用のコンフィギュレーションnew
: 新規ページ専用のコンフィギュレーション
デフォルトでは、セクションの定義はすべて空です。アドミンジェネレータは実行可能なすべてのオプションに応じて適切なデフォルトを用意します。
generator: param: config: actions: ~ fields: ~ list: ~ filter: ~ form: ~ edit: ~ new: ~
この章では、アドミンジェネレータをカスタマイズするときにおいて、config
エントリを通じて利用可能なすべてのオプションを説明します。
note
何らかの説明がなければ、Propel と Doctrine の両方においてオプションの効果は同じです。
フィールド
多くのオプションはフィールドのリストを引数にとります。フィールドは実際のカラム名もしくは仮想的な名前になります。両方のケースにおいて、ゲッターをモデルクラスのなかで定義しなければなりません (get
の後にキャメルケースのフィールド名をつけます)。
アドミンジェネレータはコンテキストに応じてフィールドをレンダリングする方法を自分で選びます。レンダリングをカスタマイズするには、パーシャルもしくはコンポーネントを用意します。慣習では、名前につけるプレフィックスは、パーシャルにはアンダースコア (_
) で、コンポーネントにはチルダ (~
) です。
display: [_title, ~content]
上記の例において、title
フィールドは title
パーシャルによってレンダリングされ、content
フィールドは content
コンポーネントによってレンダリングされます。
アドミンジェネレータはパーシャルとコンポーネントにいくつかのパラメータを渡します。
new
とedit
ページに渡されるパラメータ:form
: 現在のモデルオブジェクトに関連づけされているフォームattributes
: ウィジェットに適用される HTML 属性の配列
list
ページに渡されるパラメータ:type
:list
MODEL_NAME
: 現在のオブジェクトのインスタンスで、MODEL_NAME はジェネレータオプションにセットされている単数形の名前です。値が明確に指定されていなければ、単数形の名前はアンダースコアで区切られたモデルクラスの名前になります (CamelCase は camel_case になります)
edit
もしくは new
ページにおいて、2カラムレイアウトを保ちたい場合 (フィールドのラベルとウィジェット)、パーシャルもしくはコンポーネントテンプレートは次のようになります。
<div class="sf_admin_form_row"> <label> <!-- 1番目のカラムに表示されるフィールドラベルもしくはコンテンツ --> </label> <!-- 2番目のカラムに表示されるフィールドウィジェットもしくはコンテンツ --> </div>
オブジェクトプレースホルダ
オプションのなかにはモデルオブジェクトプレースホルダを受け取るものがあります。プレースホルダは %%NAME%%
のパターンにしたがう文字列です。NAME
は任意の文字列で、オブジェクトのゲッターメソッドに変換されます (get
の後にキャメルケースの NAME
文字列がつきます)。たとえば、%%title%%
は $article->getTitle()
の値に置き換わります。実行時において、現在のコンテキストに関連するオブジェクトに応じて、プレースホルダの値は動的に置き換わります。
tip
モデルのなかに別のモデルへの外部キーが存在していれば、Propel と Doctrine は関連オブジェクトのゲッターを定義します。その他のゲッターに関して、オブジェクトを文字列に変換する __toString()
メソッドが定義されていれば、ゲッターをプレースホルダに用いることができます。
コンフィギュレーションの継承
アドミンジェネレータのコンフィギュレーションはコンフィギュレーションカスケードの原則にしたがいます。継承ルールは次のとおりです。
new
とedit
はform
を継承し、form
はfields
を継承します。list
はfields
を継承します。filter
はfields
を継承します。
クレデンシャル
credential
オプション (下記の節をご参照ください) を使えば、ユーザークレデンシャルに応じて (リストとフォームにおける) アドミンジェネレータのアクションを隠すことができます。しかしながら、リンクもしくはボタンが表示されないアクションであっても不正なアクセスからアクションを守らなければならないことがあります。アドミンジェネレータのクレデンシャル管理機能は表示の仕事だけを受け持ちます。
credential
オプションは list ページのカラムを隠すためにも使うこともできます。
アクションのカスタマイズ
既存のコンフィギュレーションがもの足りなければ、生成メソッドをオーバーライドする選択肢があります。
メソッド | 説明 |
---|---|
executeIndex() |
list ビューアクション |
executeFilter() |
フィルタを更新します |
executeNew() |
new ビューアクション |
executeCreate() |
新しいレコードを作ります |
executeEdit() |
edit ビューアクション |
executeUpdate() |
レコードを更新します |
executeDelete() |
レコードを削除します |
executeBatch() |
バッチアクションを実行します |
executeBatchDelete() |
_delete バッチアクションを実行します |
processForm() |
レコードフォームを処理します |
getFilters() |
現在のフィルタを返します |
setFilters() |
フィルタをセットします |
getPager() |
list ページャを返します |
getPage() |
ページャページを取得します |
setPage() |
ページャページをセットします |
buildCriteria() |
list の Criteria をビルドします |
addSortCriteria() |
list のソート Criteria を追加します |
getSort() |
現在のソートカラムを返します |
setSort() |
現在のソートカラムをセットします |
テンプレートのカスタマイズ
それぞれの生成テンプレートをオーバーライドできます。
テンプレート | 説明 |
---|---|
_assets.php |
テンプレートに使う CSS と JS をレンダリングします |
_filters.php |
フィルタボックスをレンダリングします |
_filters_field.php |
単独のフィルタフィールドをレンダリングします |
_flashes.php |
フラッシュメッセージをレンダリングします |
_form.php |
フォームを表示します |
_form_actions.php |
フォームのアクションを表示します |
_form_field.php |
単独のフォームフィールドを表示します |
_form_fieldset.php |
フォームのフィールドセットを表示します |
_form_footer.php |
フォームのフッターを表示します |
_form_header.php |
フォームのヘッダーを表示します |
_list.php |
list を表示します |
_list_actions.php |
list アクションを表示します |
_list_batch_actions.php |
list バッチアクションを表示します |
_list_field_boolean.php |
list における単独のブール型フィールドを表示します |
_list_footer.php |
list のフッターを表示します |
_list_header.php |
list のヘッダーを表示します |
_list_td_actions.php |
列のオブジェクトアクションを表示します |
_list_td_batch_actions.php |
列のチェックボックスを表示します |
_list_td_stacked.php |
列のスタックレイアウトを表示します |
_list_td_tabular.php |
list の単独フィールドを表示します |
_list_th_stacked.php |
ヘッダーにおける単独のカラム名を表示します |
_list_th_tabular.php |
ヘッダーにおける単独のカラム名を表示します |
_pagination.php |
list のページ送りを表示します |
editSuccess.php |
edit ビューを表示します |
indexSuccess.php |
list ビューを表示します |
newSuccess.php |
new ビューを表示します |
見た目のカスタマイズ
生成されるテンプレートにはさまざまな class
と id
属性が定義されているので、アドミンジェネレータの見た目をかんたんにカスタマイズできます。
edit
もしくは new
ページにおいて、それぞれのフィールドの HTML コンテナには次のクラスがとりそろえられています。
sf_admin_form_row
- フィールドの型に依存するクラス:
sf_admin_text
、sf_admin_boolean
、sf_admin_date
、sf_admin_time
もしくはsf_admin_foreignkey
。 sf_admin_form_field_COLUMN
。COLUMN
はカラムの名前です。
list
ページにおいて、それぞれのフィールドの HTML コンテナには次のクラスがとりそろえられています。
- フィールドの型に依存するクラス:
sf_admin_text
、sf_admin_boolean
、sf_admin_date
、sf_admin_time
、もしくはsf_admin_foreignkey
sf_admin_form_field_COLUMN
。COLUMN
はカラムの名前です。
利用可能なコンフィギュレーションオプションの一覧
fields
fields
セクションはそれぞれのフィールドのデフォルトコンフィギュレーションを定義します。このコンフィギュレーションはすべてのページに対して定義され、ページごとにオーバーライドできます (list
、filter
、form
、edit
と new
)。
label
デフォルト: わかりやすい名前のカラム
label
オプションはフィールドに使われるラベルを定義します。
config: fields: slug: { label: "URL のショートカット" }
help
デフォルト: なし
help
オプションはフィールドに表示されるヘルプテキストを定義します。
attributes
デフォルト: array()
attributes
オプションはウィジェットに渡される HTML 属性を定義します。
config: fields: slug: { attributes: { class: foo } }
credentials
デフォルト: なし
credentials
オプションはフィールドを表示するためにユーザーがもっていなければならない必須のクレデンシャルを定義します。クレデンシャルが強制されるアクションはリストにあげられているものにかぎられます。
config: fields: slug: { credentials: [admin] } is_online: { credentials: [[admin, moderator]] }
note
クレデンシャルは security.yml
ファイルと同じルールで定義されます。
renderer
デフォルト: なし
renderer
オプションはフィールドをレンダリングするために呼び出す PHP コールバックを定義します。定義されていれば、パーシャルやコンポーネントなどのフラグはオーバーライドします。
コールバックは呼び出される際に renderer_arguments
オプションで定義されているフィールドと引数の値を受け取ります。
renderer_arguments
デフォルト: array()
renderer_arguments
オプションはフィールドがレンダリングされる際に PHP の renderer
コールバックに渡される引数を定義します。このオプションが適用されるのは renderer
オプションが定義されている場合にかぎられます。
type
デフォルト: バーチャルカラムの Text
type
オプションはカラムの型を定義します。デフォルトでは、モデルで定義されているカラムの型が使われますが、バーチャルカラムを作るのであれば、デフォルトの Text
型を有効な型のうちの1つでオーバーライドできます。
ForeignKey
Boolean
Date
Time
Text
Enum
(Doctrine 限定)
date_format
デフォルト: f
date_format
オプションは日付の表示に使われるフォーマットを定義します。値は sfDateFormat
クラスによって認識されるフォーマットです。フィールドの型が Date
である場合はこのオプションは適用されません。
次のトークンをフォーマットに使うことができます。
G
: Eray
: yearM
: mond
: mdayh
: Hour12H
: hoursm
: minutess
: secondsE
: wdayD
: ydayF
: DayInMonthw
: WeekInYearW
: WeekInMontha
: AMPMk
: HourInDayK
: HourInAMPMz
: TimeZone
actions
さまざまなアクションがあらかじめ定義され、組み込まれています。これらすべての名前にはプレフィックスのアンダースコア (_
) がつきます。それぞれのアクションはこの節で説明されているオプションでカスタマイズできます。アクションを list
、edit
もしくは new
エントリで定義する場合にも同じオプションを使うことができます。
label
デフォルト: アクションのキー
label
オプションはアクションに使うラベルを定義します。
action
デフォルト: アクションの名前に応じて定義されます。
action
オプションは実行するアクションの名前を定義します (プレフィックスの execute
はつきません)。
credentials
デフォルト: なし
credentials
オプションはアクションを表示するためにユーザーがもっていなければならないクレデンシャルを定義します。
note
クレデンシャルは security.yml
ファイルと同じルールで定義されます。
list
title
デフォルト: わかりやすい名前で、サフィックスが「List」であるモデルクラス
title
オプションは list ページのタイトルを定義します。
display
デフォルト: すべてのモデルカラム、表示順序はスキーマファイルの定義順と同じ
display
オプションは list ページに表示されるカラムの順序つき配列を定義します。
カラムの名前の前に等号 (=
) をつければ、文字列は現在のオブジェクトの edit
ページに進むリンクに変換されるようになります。
config: list: display: [=name, slug]
note
カラムを隠す hide
オプションもご参照ください。
hide
デフォルト: なし
hide
オプションは list ページから隠すカラムを定義します。表示されるカラムを display
オプションで指定するよりも、こちらのほうが作業が少なくてすむことがあります。
config: list: hide: [created_at, updated_at]
note
display
と hide
オプションの両方が指定されている場合、hide
オプションは無視されます。
layout
デフォルト: tabular
利用可能な値: tabular
もしくは stacked
layout
オプションは list ページの表示に使われるレイアウトを定義します。
tabular
レイアウトでは、独自のテーブルのカラムにそれぞれのカラムの値が入ります。
stacked
レイアウトでは、それぞれのオブジェクトは params
オプションで定義されている単独の文字列であらわされます (下記の節をご参照ください)。
note
ユーザーがソートできるカラムは display
オプションによって定義されるので、stacked
レイアウトを使う場合にもこのオプションは必要です。
params
デフォルト: なし
params
オプションは stacked
レイアウトに使われる HTML 文字列のパターンを定義します。この文字列にモデルオブジェクトのプレースホルダを埋め込むことができます。
config: list: params: | %%title%% written by %%author%% and published on %%published_at%%.
カラムの名前の前に等号 (=
) をつけると、文字列は現在のオブジェクトの edit
ページに進むリンクに変換されるようになります。
sort
デフォルト: なし
sort
オプションはデフォルトの sort カラムを定義します。このオプションはカラムの名前とソートの順序 (asc
もしくは desc
) からなります。
config: list: sort: [published_at, desc]
max_per_page
デフォルト: 20
max_per_page
オプションは1ページに表示されるオブジェクトの最大個数を定義します。
pager_class
デフォルト: Propel では sfPropelPager
、Doctrine では sfDoctrinePager
pager_class
オプションは list ページが表示される際に使われるページャクラスを定義します。
batch_actions
デフォルト: { _delete: ~ }
batch_actions
オプションは list ページにおいてオブジェクトを選ぶために実行されるアクションのリストを定義します。
action
オプションが定義されていない場合、アドミンジェネレータは executeBatch
をプレフィックスとするキャメルケースの名前をもつメソッドを探します。
実行されるメソッドは ids
リクエストパラメータを通じて選ばれたオブジェクトのプライマリキーを受け取ります。
tip
バッチアクションを無効にするには、このオプションに空の配列 ({}
) にセットします。
object_actions
デフォルト: { _edit: ~, _delete: ~ }
object_actions
オプションはリストのそれぞれのオブジェクトで実行できるアクションのリストを定義します。
object_actions: moveUp: { label: "move up", action: "moveUp" } moveDown: { label: "move down", action: "moveDown" } _edit: ~ _delete: ~
action
オプションが定義されていなければ、アドミンジェネレータは executeList
をプレフィックスとするキャメルケースの名前をもつメソッドを探します。
tip
オブジェクトアクションを無効にするには、このオプションに空の配列 ({}
) をセットします。
actions
デフォルト: { _new: ~ }
actions
オプションはオブジェクトを受け取らないアクションを定義します。用例としてオブジェクトの新規作成をあげることができます。
action
オプションが定義されていない場合、アドミンジェネレータは executeList
をプレフィックスとするキャメルケースの名前のメソッドを探します。
tip
オブジェクトアクションの機能を無効にするには、オプションに空の配列 ({}
) をセットします。
peer_method
デフォルト: doSelect
peer_method
オプションは list ページで表示されるオブジェクトを検索するために呼び出すメソッドを定義します。
caution
このオプションは Propel 専用です。Doctrine では table_method
オプションを使います。
table_method
デフォルト: doSelect
table_method
オプションは list ページで表示されるオブジェクトを検索するために呼び出すメソッドを定義します。
caution
このオプションは Doctrine 専用です。Propel では peer_method
オプションを使います。
peer_count_method
デフォルト: doCount
peer_count_method
オプションは現在のフィルタオブジェクトの個数を算出するために呼び出すメソッドを定義します。
caution
このオプションは Propel 専用です。Doctrine では table_count_method
オプションを使います。
table_count_method
デフォルト: doCount
table_count_method
オプションは現在のフィルタオブジェクトの個数を算出するために呼び出すメソッドを定義します。
caution
このオプションは Doctrine 専用です。Propel では peer_count_method
オプションを使います。
filter
filter
セクションは list ページに表示されるフォームにフィルタをかける方法を指定するためのコンフィギュレーションを定義します。
display
デフォルト: フィルタフォームクラスで定義されているすべてのフィールド、表示順序は定義順と同じ
display
オプションは表示されるフィールドの順序つきリストを定義します。
tip
フィルタフィールドはつねにオプションで、表示されるフィールドを設定するためにフィルタフォームクラスをオーバーライドする必要はありません。
class
デフォルト: FormFilter
をサフィックスとするモデルクラスの名前
class
オプションは filter
フォームに使われるフォームクラスを定義します。
tip
フィルタリングを完全に除外するには、このオプションに false
をセットします。
form
form
セクションは edit
と new
セクションのフォールバックとしての役目を果たすためだけに用意されています (最初の継承ルールをご参照ください)。
note
フォームセクション (form
、edit
と new
) に関して、label
と help
オプションはフォームクラスで定義されているものをオーバーライドします。
display
デフォルト: フォームクラスで定義されているすべてのクラス。表示順序は定義順と同じ。
display
オプションは表示されるフィールドの順序つきリストを定義します。
このオプションは複数のフィールドを1つのグループにまとめるために使うこともできます。
# apps/backend/modules/model/config/generator.yml config: form: display: Content: [title, body, author] Admin: [is_published, expires_at]
上記のコンフィギュレーションは2つのグループ (Content
と Admin
) を定義しています。それぞれのグループにフォームフィールドのサブセットが用意されています。
caution
モデルフォームで定義されているすべてのフィールドは display
オプションに存在していなければなりません。存在していなければ、予期せぬバリデーションエラーが発生する可能性があります。
class
デフォルト: Form
をサフィックスとするモデルクラスの名前
class
オプションは edit
と new
ページに使われるフォームクラスを定義します。
tip
class
オプションは new
と edit
セクションの両方で定義できますが、1つのクラスを使い、条件ロジックで対処するほうがよいやりかたです。
edit
edit
セクションは form
セクションと同じオプションをとります。
title
デフォルト: Edit
をサフィックスとするモデルクラスの名前
title
オプションは edit ページのタイトルを定義します。このオプションはモデルオブジェクトのプレースホルダをとることができます。
actions
デフォルト: { _delete: ~, _list: ~, _save: ~ }
actions
オプションはフォームを投稿する際に利用可能なアクションを定義します。
new
new
セクションは form
セクションと同じオプションをとります。
title
デフォルト: New
をサフィックスとするモデルクラスの名前
title
オプションは新しいページのタイトルを定義します。このオプションはモデルオブジェクトのプレースホルダをとることができます。
tip
オブジェクトが新しい場合でも、タイトルの一部として出力したいデフォルトの値を指定することができます。
actions
デフォルト: { _delete: ~, _list: ~, _save: ~, _save_and_add: ~ }
actions
オプションはフォームを投稿する際に利用可能なアクションを定義します。
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License license.