我正在开发一个在我正在开发的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。那么如何检测国际化学说模型是否被修改?
提前致谢;)
答案 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,要么添加行为要么直接调用它们(后者要好得多)
此致