5 Stimmen

Doktrin postSave, postUpdate und Internationalisierung (Änderung feststellen)

Ich habe ein kleines Problem mit einer Tabelle, die das i18n-Verhalten auf ein Symfony 1.4-Projekt verwenden, die ich entwickle. Zum Beispiel auf das folgende Modell auf YAML definiert (ich habe andere, die das gleiche Muster folgen):

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

Ich habe nur das Namensfeld, das internationalisiert ist, aber beim Speichern (nach dem Ändern einer der Sprachen auf einem Formular) die postUpdate($event)-Methode wird nicht ausgelöst. Ich dachte, ich kann die postSave($event)-Methode verwenden und prüfen, ob sie geändert wurde, aber sie gibt auch immer false zurück. Wie kann ich also feststellen, ob ein internationalisiertes Doctrine-Modell geändert wurde?

Vielen Dank im Voraus ;)

1 Stimmen

Gibt es jemanden, der mit demselben Problem konfrontiert wurde?

0 Stimmen

Entschuldigung für die Wiederbelebung dieses Themas, aber ich habe eine ähnliche Erfahrung mit der postSave-Methode: i18n-Felder in einem neuen Datensatz werden beim ersten Mal nicht gespeichert.

1voto

javiertoledos Punkte 991

Die kurze Antwort, die ich gefunden habe, ist, dass es keinen einfachen oder eleganten Weg gibt, die i18n-Formulare zu verwenden.

Das Problem ist, dass die i18n-Formulare in Symfony direkt mit $record->Translation arbeiten, Symfony verwendet keine _set-Methode, in diesem Fall gibt es keine Änderungen im ursprünglichen Datensatz (Subject) nur im recordTranslation-Objekt.

Vielleicht, wenn Sie die saveEmbeddedForms-Methode in Ihrem Datensatz-Formular (SubjectForm) überschreiben, über alle i18n-Formulare iterieren und für jedes erkennen, das geändert wurde, und schließlich in irgendeiner Weise ändern oder den ursprünglichen Datensatz als geändert kennzeichnen, so dass, wenn es gespeichert wird, das Ereignis postSave ausgelöst wird.

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();
}

  }

0voto

m4rc Punkte 2834

Bei jedem Lehrsatz können Sie einfach Folgendes tun

$record->isModified();

Und wenn Sie herausfinden wollen, ob ein bestimmtes Feld geändert wurde, können Sie das tun.

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

Ich hoffe, das hilft

0voto

Benoit Punkte 3504

Doctrine-Datensatz-Hooks (preInsert, postInsert, etc.) werden nicht ausgelöst, wenn DQL oder einfaches SQL zum Ändern von Datensätzen verwendet wird.

Ich erinnere mich, dass sie in sfDoctrineObjectForm nicht so gut aufgerufen werden, und man muss Methoden in der Formklasse überschreiben, wie doSave, entweder um Verhalten hinzuzufügen oder um sie direkt aufzurufen (letzteres ist imho viel besser)

Herzliche Grüße,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X