У меня есть базовая установка M: N с тремя таблицами: кандидат, позиция и кандидат_позиция.
Вот скриншот ERD от MySQL Workbench
Теперь, переходя от этого, давайте поговорим о формах. В стандартном мире генератора Symfony у вас будет отдельный интерфейс CRUD для всех этих трех таблиц. Однако я не хочу иметь CRUD-интерфейс для candidate_position
.
Я хочу, чтобы действия по созданию и редактированию интерфейса кандидата содержали поле с несколькими вариантами выбора (список выбора, массив флажков и т. Д.), Которое создавало бы записи CandidatePosition как часть действий кандидата.
На коду
config / doctrine / schema.yml (Примечание: это не весь schema.yml, а только обсуждаемые здесь таблицы)
---
detect_relations: true
options:
type: InnoDB
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
relations:
Positions:
class: Position
refClass: CandidatePosition
local: candidate_id
foreign: position_id
position:
columns:
id:
type: integer(4)
primary: true
unsigned: true
notnull: true
autoincrement: true
name:
type: string(45)
relations:
Candidates:
class: Candidate
refClass: CandidatePosition
local: position_id
foreign: candidate_id
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
indexes:
fk_candidate_position_candidate1:
fields: [candidate_id]
fk_candidate_position_position1:
fields: [position_id]
приложения / бэкэнда / модули / кандидат / конфиг / 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 }
candidate_positions: {label: Positions}
list:
sort: [last_name, asc]
filter: ~
form:
display:
"User": [first_name, last_name]
"Applying For": [candidate_positions]
fields :
hide: [created_at]
edit: ~
new: ~
Библиотека / форма / учение / candidateForm.class.php
class candidateForm extends BasecandidateForm
{
public function configure()
{
unset( $this['created_at'] );
$this->widgetSchema['candidate_positions'] = new sfWidgetFormDoctrineChoice(
array( 'multiple' => true, 'model' => 'Position', 'renderer_class' => 'sfWidgetFormSelectCheckbox' )
);
$this->validatorSchema['candidate_positions'] = new sfValidatorDoctrineChoice(
array( 'multiple' => true, 'model' => 'Position', 'min' => 1 )
);
}
}
Это все работает, кроме случаев, когда дело доходит до фактического сохранения данных. Это та точка, в которой я застреваю.
Я явно должен сделать что-то , чтобы создать / отредактировать / удалить записи CandidatePosition, но я не уверен, с чего начать. В candidateActions
? Переопределить Basecandidate::save()
?
Дайте мне знать, если вам понадобятся какие-либо другие данные.