2010-10-06 18 views
5

我在使用我正在開發的Symfony 1.4項目中使用i18n行爲的表有一點問題。例如對YAML定義下面的模型(我有一個遵循相同的模式等):學說postSave,postUpdate和國際化(檢測修改)

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。那麼,如何檢測國際化原則模型是否被修改?

在此先感謝;)

+1

有沒有人遇到同樣的問題? – petersaints 2010-10-14 22:58:47

+0

對不起,以恢復這個問題,但我有類似postSave方法expirience:新的記錄上的i18n字段不會保存第一次。 – 4levels 2013-02-28 11:37:36

回答

0

在任何學說記錄你可以做

$record->isModified(); 

如果你想找出一個特定的領域已被修改,你可以做。

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

希望幫助

1

簡短的答案我發現的是,沒有使用國際化形式的一個簡單的或優雅的方式。

我沒有找到明確的方法來做到這一點,問題在於symfony中的i18n表單直接使用$ record-> Translation,symfony沒有使用任何_set方法,在這種情況下,存在只在recordTranslation對象中的原始記錄(Subject)中沒有修改。

也許如果你重寫記錄表單(SubjectForm)中的saveEmbeddedForms方法,迭代所有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

學說記錄掛鉤(preInsert,postInsert等)時DQL或純SQL用於改變記錄未trigerred。

我記得在sfDoctrineObjectForm他們不叫,以及,你必須重寫窗體類,像DoSave就會方法,要麼添加行爲,或者他們直接調用(後者要好得多恕我直言)

問候,