Встроенная связь с Symfony 1.4 - PullRequest
1 голос
/ 29 февраля 2012

Раньше я играл со встроенными отношениями / формами в 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

1 Ответ

1 голос
/ 01 марта 2012

Хорошо, после долгого дня я нашел решение ... Но я не уверен, что это самое правильное решение ...

Я переопределяю метод doSave в своей форме.После вызова updateObject я проверяю, присутствуют ли идентификаторы в значениях или нет.Вроде работает ...

protected function doSave($con = null) {
    if (null === $con)
    {
      $con = $this->getConnection();
    }

    $this->updateObject();

    $v = $this->getValues();
    if (isset($v['Departure']['id']))
        $this->getObject()->setCityDepartureId($v['Departure']['id']);
    if (isset($v['Destination']['id']))
        $this->getObject()->setCityDestinationId($v['Destination']['id']);

    $this->getObject()->save($con);

    // embedded forms
    $this->saveEmbeddedForms($con);
}
...