Раньше я играл со встроенными отношениями / формами в Symfony 1.4, но у меня не получается решить проблему.
Что я хочу сделать:
- Когда пользователь создает новое событие, я встраиваю отношение / формы для пункта назначения и пункта отправления
- Пользовательможет быть в состоянии выбрать существующий город с помощью sfWidgetFormJQueryAutocompleter, и если город не существует в БД, новый город вставляется и устанавливается связь между отправлением / пунктом назначения и событием.
Я попытался просто вставить отношение, как это, в форму моего города
public function configure() {
parent::configure();
unset($this['city_departure_id']);
unset($this['city_destination_id']);
$this->embedRelation('Departure', new MyCityForm($this->getObject()->getDeparture()));
$this->embedRelation('Destination', new MyCityForm($this->getObject()->getDestination()));
...
}
Если есть новый город, он работает, но когда я возвращаюсь к существующему городу (идентификатор, имя и страна заселены правильно), этопотерпеть неудачу, сказав Id Invalid.
Я попытался исправить свой валидатор по умолчанию для идентификатора и преобразовать базовый валидатор (sfValdidatorChoice) в
$this->setValidator('id', new sfValidatorPass(array('required' => false)));
Он проходит проверку, но терпит неудачу, потому что Symfony пытается создать новый объект с точно таким же значением.
Теперь я попытался переопределить метод сохранения для города в нечто вроде этого:
public function save(Doctrine_Connection $con = null) {
if ($this->isNew() && $this->getId() != "") {
return $this;
}
return parent::save($con);
}
Теперь он создает города при необходимости, но не тогда, когда они уже существуют.
Моя новая проблема - сбой при вставке события.Выдается новое исключение, говорящее:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'city_destination_id' cannot be null
(в данном случае city_departure был новым, а пункт назначения существующим)
Вот мой schema.yml
Event:
connection: doctrine
tableName: sortie
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: true
description:
type: string(255)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
start_date:
type: date(25)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
city_departure_id:
type: integer(4)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
city_destination_id:
type: integer(4)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
Departure:
local: city_departure__id
foreign: id
class: City
type: one
Destination:
class: City
local: city_destination_id
foreign: id
type: one
City:
connection: doctrine
tableName: localite
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: true
name:
type: string(100)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
country:
type: string(100)
fixed: false
unsigned: false
primary: false
notnull: true
autoincrement: false
relations:
Departures:
local: id
foreign: localite_depart_id
type: many
Destinations:
class: Sortie
local: id
foreign: localite_destination_id
type: many