候補、位置、および候補位置の 3 つのテーブルを使用した基本的な M:N セットアップがあります。これは、テキストだけでカラスの足スタイルの ERD に最高の刺し傷を付けたものです。
[candiate]-||------|<[candidate_position]>|------||-[position]
私が達成しようとしているのはこれです:candidate
が作成または編集されているとき、フォームには候補者に割り当てることができるすべてのポジションのチェックボックス配列が含まれます。
通常の Web アプリ開発の世界では、これは実に簡単です。しかし、私は symfony の admin ジェネレーターで自分の能力を高めようとしています。ここに私がこれまでに持っているものがあります
アプリ/バックエンド/モジュール/condidate/config/generator.yml
generator:
class: sfDoctrineGenerator
param:
model_class: Candidate
theme: admin
non_verbose_templates: true
with_show: false
singular: ~
plural: ~
route_prefix: candidate
with_doctrine_route: true
actions_base_class: sfActions
config:
actions: ~
fields:
first_name: { label: First Name }
last_name: { label: Last Name }
created_at: { label: Created On }
positions: {}
list:
sort: [last_name, asc]
filter: ~
form:
display:
"User": [first_name, last_name]
"Applying For": [positions]
fields :
hide: [created_at]
edit: ~
new: ~
lib/form/doctrine/candidateForm.class.php
class candidateForm extends BasecandidateForm
{
public function configure()
{
unset( $this['created_at'] );
$this->widgetSchema['positions'] = new sfWidgetFormDoctrineChoice(
array( 'multiple' => true, 'model' => 'Position', 'renderer_class' => 'sfWidgetFormSelectCheckbox' )
);
$this->validatorSchema['positions'] = new sfValidatorDoctrineChoice(
array( 'multiple' => true, 'model' => 'Position', 'min' => 1 )
);
}
}
config/doctrine/schema.yml
candidate:
columns:
id:
type: integer(4)
primary: true
unsigned: true
notnull: true
autoincrement: true
first_name:
type: string(45)
notnull: true
last_name:
type: string(45)
notnull: true
created_at:
type: integer(4)
unsigned: true
position:
columns:
id:
type: integer(4)
primary: true
unsigned: true
notnull: true
autoincrement: true
name:
type: string(45)
candidatePosition:
tableName: candidate_position
columns:
candidate_id:
type: integer(4)
primary: true
unsigned: true
notnull: true
position_id:
type: integer(4)
primary: true
unsigned: true
notnull: true
relations:
candidate:
class: candidate
local: candidate_id
foreign: id
foreignAlias: candidate_positions
position:
class: position
local: position_id
foreign: id
foreignAlias: candidate_positions
indexes:
fk_candidate_position_candidate1:
fields: [candidate_id]
fk_candidate_position_position1:
fields: [position_id]
そして、これはうまくいきます!=/の並べ替え
チェックボックスは作成画面と編集画面に表示されますが、データは保存されません。明らかに (?) モデル (lib/model/doctrine/candidate.class.php) をカスタマイズする必要があり、そこに焦点を当てていません。内部から候補者 [positions] データを取得する方法がわかりませんcandidate::save()
- PHP 5.2.x
- symfony 1.4.3