2010-10-06 7 views
5

Sto riscontrando un piccolo problema con le tabelle che utilizzano il comportamento i18n su un progetto Symfony 1.4 che sto sviluppando. Per esempio sul modello seguito definita su YAML (ne ho altri che seguono lo stesso modello):Doctrine post Salvataggio, PostUpdate e Internazionalizzazione (Rileva modifica)

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 

ho solo il campo nome che è internazionalizzato, ma su Save (dopo aver modificato una delle lingue in un modulo) il metodo postUpdate ($ event) non viene attivato. Ho pensato, beh, posso usare il metodo postSave ($ event) e verificare se è stato modificato, ma restituisce sempre anche false. Quindi, come posso rilevare se un modello di Doctrine internazionalizzato è stato modificato?

Grazie in anticipo;)

+1

C'è qualcuno che ha affrontato lo stesso problema? – petersaints

+0

Ci scusiamo per rianimare questo problema, ma ho un'esperienza simile con il metodo postSave: i campi i18n su un nuovo record non vengono salvati la prima volta. – 4levels

risposta

0

Su qualsiasi record dottrina si può solo fare

$record->isModified(); 

E se si vuole scoprire se un particolare campo è stato modificato si può fare.

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

Speranza che aiuta

1

La risposta breve che ho trovato è, non c'è un modo facile o elegante utilizzando i moduli i18n.

Non ho trovato un modo chiaro per farlo, il problema è che i moduli i18n in symfony funzionano direttamente con $ record-> Translation, symfony non usa alcun metodo _set, in questo caso, c'è nessuna modifica nel record originale (Oggetto) solo nell'oggetto recordTranslation.

Forse se si esegue l'override del metodo saveEmbeddedForms nel modulo di registrazione (SubjectForm), iterando su tutti i moduli i18n e rilevando per ognuno quello che è stato modificato e infine si modifica in qualche modo o contrassegno come modificato il record originale, quindi quando viene salvato l'evento postSave verrà attivato.

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

Doctrine record ganci (preInsert, postInsert, etc.) non sono trigerred quando DQL o SQL normale viene utilizzato per alterare record.

mi ricordo in sfDoctrineObjectForm non sono chiamati così, e bisogna sostituire i metodi di classe di form, come doSave, sia per aggiungere un comportamento o di chiamare direttamente (quest'ultimo è molto meglio imho)

Saluti ,