【问题标题】:Zend Lucene with symfony and i18nZend Lucene 与 symfony 和 i18n
【发布时间】:2011-12-18 00:10:22
【问题描述】:

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

我的模型有i18n 字段,其中一些(即nametitle)我想插入到索引中。一切都按预期工作,但是当将i18n 字段保存到索引中时,我得到的只是空白值($this->getName() 返回空字符串)。我正在使用Luke 检查创建的索引。

我最终发现这与 Zend Lucene 无关,而与 symfony 无关。在save 期间,i18n 字段的信息似乎不可用(或者是吗?)。我也尝试在preSave()postSave() 期间连接更新,但无济于事。

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

重要提示:这只发生在doctrine:data-load 任务期间。如果我手动插入或更新记录,则索引会相应更新。

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

【问题讨论】:

  • 为了回答我的第二个问题,我发现使用$this->Translation['<culture>']['<field>'] 成功返回了培养字段的值。即使这在 data-load 任务中不起作用(总是在 save 模型的方法中)

标签: zend-framework symfony1 internationalization lucene symfony-1.4


【解决方案1】:

Symfony 出现这种奇怪行为的原因是当你通过 cli 加载fixture 时,它​​没有加载上下文(例如当你尝试获取上下文实例sfContext::getInstance() 时,你会得到“上下文实例不存在”错误例外)。

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

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

这意味着两件事:

  • 你不能使用 symfony 的“当前用户文化”功能 在 cli 会话中
  • 如果您需要在您的某处有sfContext::getInstance() 代码(特别是在模型中),您必须将其关闭,以避免在 cli 中出现意外和难以找到的异常的任何麻烦

在模型类中获取当前文化的示例(在 cli 中不会通过条件):

if (sfContext::hasInstance()) {
  sfContext::getInstance()->getUser()->getCulture();
}

因此,当您无法使用 Symfony i18n 快捷方式(如 $record->getName())时,您必须解决它。 在您的 symfony1-doctrine 模型中,您总是有 $this->Translation 对象可用。 因此,您可以通过 $this->Translation[$culture] 之类的方式访问您的翻译值对象。

由您决定,您可以使用您的默认文化$this->Translation[sfConfig::get('sf_default_culture')],或从一些全局配置中通过您支持的所有文化进行交互(我建议您在全局配置文件之一中设置它)应用程序 - 可能是 /config/app.yml)。

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

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2012-07-26
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多