Zend framework Zend Lucene与symfony和i18n
我经历了将Zend Lucene集成到symfony(1.4.8)项目中的过程,以便将搜索功能添加到我的网站前端(通过索引)。除其他外,关键概念是在模型的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
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['''][''']
可以成功返回培养字段的值。即使这样,在数据加载
任务中也不起作用(始终在保存
模型的方法中)