Доктрина postSave, postUpdate и Интернационализация (обнаружение модификации) - PullRequest
5 голосов
/ 06 октября 2010

У меня небольшая проблема с таблицами, использующими поведение i18n в проекте Symfony 1.4, который я разрабатываю. Например, для следующей модели, определенной в YAML (у меня есть другие, которые следуют той же схеме):

Subject:
  actAs:
    Timestampable: ~
    I18n:
      fields: [name]
  columns:
    name: { type: string(255), notnull: true }
  relations:
    Publications:
      class: Publication
      refClass: PublicationSubject
      local: subject_id
      foreign: publication_id

У меня есть только поле имени, которое интернационализировано, но при сохранении (после изменения одного из языков в форме) метод postUpdate ($ event) не запускается. Я подумал, что я могу использовать метод postSave ($ event) и проверить, не изменился ли он, но он также всегда возвращает false. Итак, как я могу определить, была ли изменена модель интернационализированной доктрины?

Заранее спасибо;)

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Короткий ответ, который я нашел, заключается в том, что простого и элегантного способа использования форм i18n не существует.

Я не нашел четкого способа сделать это, проблема в том, что формы i18n в symfony работают напрямую с $ record-> Translation, symfony не использует какой-либо метод _set, в этом случае нет изменения в исходной записи (Subject) только в объекте recordTranslation.

Возможно, если вы переопределите метод saveEmbeddedForms в форме записи (SubjectForm), перебираете все формы i18n и обнаруживаете для каждой измененной формы и, наконец, каким-либо образом изменяете или помечаете как измененную исходную запись, поэтому, когда сохранено событие postSave будет запущено.

public $already_saved;

  public function doSave($con = null) {
    $this->already_saved = $this->object->isModified();
    parent::doSave($con);
  }



public function saveEmbeddedForms($con = null,$forms = null){

if (null === $con)
  $con = $this->getConnection();


if (null === $forms)
  $forms = $this->embeddedForms;

foreach($forms as $form) {
  if  ( count($form->object->isModified()) != 0){ 
    $mark_for_save = true;
    break;
  }
}
parent::saveEmbeddedForms($con, $forms);
if (@$mark_for_save && !$this->already_saved) {
  $this->object->postSave();
}

  }
0 голосов
/ 16 июня 2011

Хуки записей Doctrine (preInsert, postInsert и т. Д.) Не запускаются, когда для изменения записей используется DQL или обычный SQL.

Я помню, что в sfDoctrineObjectForm они тоже не вызываются, и вам нужно переопределить методы в классе формы, такие как doSave, либо для добавления поведения, либо для их непосредственного вызова (последний намного лучше imho)

С уважением,

0 голосов
/ 20 января 2011

Для любой записи доктрины вы можете просто сделать

$record->isModified();

И если вы хотите узнать, было ли изменено определенное поле, вы можете сделать.

$modified = $record->getModified();
if(isset($modified['fieldName']))
{
   //do something
}

Надеюсь, что это поможет

...