Doctrine postSave,postUpdate和Internationalization(检测修改)

时间:2010-10-06 19:35:39

标签: php internationalization symfony1 doctrine

我正在开发一个在我正在开发的Symfony 1.4项目中使用i18n行为的表有一点问题。例如,在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 个答案:

答案 0 :(得分:1)

我发现简短的回答是,使用i18n表格没有一种简单或优雅的方式。

我没有找到明确的方法来做到这一点,问题是symfony中的i18n表单直接与$ record->翻译工作,symfony不使用任何_set方法,在这种情况下,有仅在recordTranslation对象中不修改原始记录(Subject)。

也许如果你覆盖记录表单中的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();
}

  }

答案 1 :(得分:0)

在任何学说记录中你都可以做到

$record->isModified();

如果您想知道特定字段是否已被修改,您可以这样做。

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

希望有所帮助

答案 2 :(得分:0)

当使用DQL或纯SQL来更改记录时,不会触发Doctrine记录挂钩(preInsert,postInsert等)。

我记得在sfDoctrineObjectForm中它们也没有被调用,你必须覆盖表单类中的方法,比如doSave,要么添加行为要么直接调用它们(后者要好得多)

此致