Zend Lucene с Symfony и i18n - PullRequest
       20

Zend Lucene с Symfony и i18n

3 голосов
/ 30 октября 2011

Я прошел Учебное пособие по Jobeet по интеграции Zend Lucene в проект Symfony (1.4.8), чтобы добавить возможности поиска в мой интерфейс моего сайта (с помощью индексации).Среди прочего, ключевая концепция заключается в использовании updateLuceneIndex во время действия модели save (необходимо переопределить) для создания / обновления индекса конкретной записи.

В моей модели i18n полей, некоторые из которых (i, e name, title) я хочу вставить в индекс.Все работает как положено, но когда дело доходит до сохранения полей i18n в индексе, все, что я получаю, это пустые значения ($this->getName() возвращает пустую строку).Я проверяю созданный индекс с помощью Luke .

Я обнаружил, что это не имеет ничего общего с Zend Lucene, но с Symfony.Кажется, что во время save информация для полей i18n недоступна (или это?).Я также пытался подключить обновление во время preSave(), postSave(), но безрезультатно.

Поэтому я хочу спросить, как мне получить значения поля i18n моей модели во время действия сохранения вЧтобы обновить индекс соответствующим образом?

Важное примечание : Это происходит только при выполнении задачи doctrine:data-load.Если я вручную вставляю или обновляю запись, индекс обновляется соответствующим образом.

Последний связанный вопрос.Было бы неплохо, если бы я мог сохранить разные ключевые слова для каждого из языков поля модели.Как я могу получить различные значения для языка каждого поля внутри модели?

1 Ответ

2 голосов
/ 02 ноября 2011

Причина этого странного поведения Symfony заключается в том, что когда вы загружаете приборы через cli, контекст не загружается (например, когда вы пытаетесь получить экземпляр контекста sfContext::getInstance(), вы получите ошибку «экземпляр контекста не существует»).исключение).

При отсутствии доступного экземпляра контекста отсутствует «текущая культура», а при отсутствии текущей культуры нет значения полей i18n.

Symfonyконтекст фактически поддерживает все функциональные возможности I18N с текущей культурой пользователя ($currentUserCulture = sfContext::getInstance()->getUser->getCulture()).

Это все означает 2 вещи:

  • Вы не можете использовать 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();
...