【问题标题】:Doctrine postSave, postUpdate and Internationalization (detect modification)Doctrine postSave、postUpdate 和 Internationalization(检测修改)
【发布时间】:2010-10-06 19:35:39
【问题描述】:

在我正在开发的 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。那么如何检测国际化 Doctrine 模型是否被修改?

提前致谢;)

【问题讨论】:

  • 有人遇到过同样的问题吗?
  • 很抱歉再次出现此问题,但我对 postSave 方法有类似的体验:新记录上的 i18n 字段第一次未保存。

标签: php internationalization symfony1 doctrine


【解决方案1】:

我找到的简短答案是,使用 i18n 表单没有简单或优雅的方式。

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

也许如果您在记录表单(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();
}

  }

【讨论】:

    【解决方案2】:

    在任何教条记录上你都可以做到

    $record->isModified();
    

    如果您想了解某个特定字段是否已被修改,您可以这样做。

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

    希望有帮助

    【讨论】:

      【解决方案3】:

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

      我记得在 sfDoctrineObjectForm 中它们也没有被调用,并且您必须覆盖表单类中的方法,例如 doSave,以添加行为或直接调用它们(后者更好恕我直言)

      问候,

      【讨论】:

        猜你喜欢
        • 2015-02-06
        • 1970-01-01
        • 2011-03-24
        • 2023-03-16
        • 2011-11-15
        • 2013-09-22
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        相关资源
        最近更新 更多