Zend framework Zend Lucene与symfony和i18n

Zend framework Zend Lucene与symfony和i18n,zend-framework,symfony1,internationalization,lucene,symfony-1.4,Zend Framework,Symfony1,Internationalization,Lucene,Symfony 1.4,我经历了将Zend Lucene集成到symfony(1.4.8)项目中的过程,以便将搜索功能添加到我的网站前端(通过索引)。除其他外,关键概念是在模型的save操作(需要覆盖)期间使用updateLuceneIndex,以创建/更新特定条目的索引 我的模型有i18n字段,其中一些字段(即name,title)我希望插入索引中。一切正常,但在将i18n字段保存到索引中时,我得到的是空值($this->getName()返回空字符串)。我正在使用检查创建的索引 我最终认为这和Zend Lucene

我经历了将Zend Lucene集成到symfony(1.4.8)项目中的过程,以便将搜索功能添加到我的网站前端(通过索引)。除其他外,关键概念是在模型的
save
操作(需要覆盖)期间使用
updateLuceneIndex
,以创建/更新特定条目的索引

我的模型有
i18n
字段,其中一些字段(即
name
title
)我希望插入索引中。一切正常,但在将
i18n
字段保存到索引中时,我得到的是空值(
$this->getName()
返回空字符串)。我正在使用检查创建的索引

我最终认为这和Zend Lucene无关,而是和symfony有关。似乎在
save
期间,
i18n
字段的信息不可用(或者是否可用?)。我还尝试在
pressave()
postSave()
期间连接更新,但没有效果

因此,我想问,在保存操作期间,我应该如何获取模型的
i18n
字段值,以便相应地更新索引

重要注意事项:这仅在
原则:数据加载任务期间发生。如果手动插入或更新记录,索引将相应地更新


最后一个相关问题。如果我能为模型字段的每种语言保存不同的关键字,那就太好了。如何获取模型中每个字段语言的不同值?

Symfony这种奇怪行为的原因是,当您通过cli加载装置时,它没有加载上下文(例如,当您尝试获取上下文实例
sfContext::getInstance()
时,您将得到“上下文实例不存在”错误(异常)

没有上下文实例可用,就没有“当前区域性”,没有当前区域性,就没有i18n字段的值。

symfony上下文实际上支持当前用户区域性的所有I18N功能(
$currentUserCulture=sfContext::getInstance()->getUser->getCulture()

这意味着两件事:

if (sfContext::hasInstance()) {
  sfContext::getInstance()->getUser()->getCulture();
}
if (sfContext::hasInstance()) {
    $translation            = $this->Translation[sfContext::getInstance()->getUser()->getCulture()];
}
else {
    $translation            = $this->Translation->getFirst();
    // or: $translation         = $this->Translation[$yourPreferedCulture];
}
// you can access to modified fields of translation object
$translationModified    = $translation->getModified();
  • 您不能在工作时使用symfony“当前用户文化”功能 在cli会话中
  • 如果您需要将
    sfContext::getInstance()
    放在 代码(特别是在模型中),您必须将其关闭到条件中,以避免在cli中出现意外和难以发现的异常
在模型类中获取当前区域性的示例(在cli中不会通过条件):

if (sfContext::hasInstance()) {
  sfContext::getInstance()->getUser()->getCulture();
}
if (sfContext::hasInstance()) {
    $translation            = $this->Translation[sfContext::getInstance()->getUser()->getCulture()];
}
else {
    $translation            = $this->Translation->getFirst();
    // or: $translation         = $this->Translation[$yourPreferedCulture];
}
// you can access to modified fields of translation object
$translationModified    = $translation->getModified();
因此,当您不能使用Symfony i18n快捷方式(如
$record->getName()
)时,您必须解决这个问题。 在symfony1条令模型中,始终有
$this->Translation
对象可用。 因此,您可以通过类似于
$this->translation[$culture]
的方式访问translation values对象

您可以使用默认区域性
$this->Translation[sfConfig::get('sf_default_culture')]
,或者从一些全局配置中通过所有受支持的区域性进行交互(我建议您将其设置在一个配置文件中,全局访问所有应用程序-可能是/config/app.yml)

在任何情况下获取$record Translation对象的示例:

if (sfContext::hasInstance()) {
  sfContext::getInstance()->getUser()->getCulture();
}
if (sfContext::hasInstance()) {
    $translation            = $this->Translation[sfContext::getInstance()->getUser()->getCulture()];
}
else {
    $translation            = $this->Translation->getFirst();
    // or: $translation         = $this->Translation[$yourPreferedCulture];
}
// you can access to modified fields of translation object
$translationModified    = $translation->getModified();

为了回答我的第二个问题,我发现使用
$this->Translation['''][''']
可以成功返回培养字段的值。即使这样,在
数据加载
任务中也不起作用(始终在
保存
模型的方法中)