Как отсортировать интернационализированную таблицу i18n с помощью symfony и доктрины? - PullRequest
1 голос
/ 21 марта 2010

Я хотел бы отобразить список записей из интернационализированной таблицы, используя sfDoctrinePager.Не все записи были переведены на все языки, поддерживаемые приложением, поэтому мне пришлось реализовать механизм отката для некоторых полей (переопределив функцию getFoo () в Bar.class.php, как объяснено в другом посте здесь),У меня есть разные резервные списки для каждой культуры.Все работает нормально, пока не произойдет сортировка записей в алфавитном порядке.

Я сортирую записи на уровне SQL (Dql), добавив -> orderBy ('t.name') кquery:

    $q = Doctrine::getTable('Foo')
        ->createQuery('f')
        ->leftJoin('f.Translation t')
        ->orderBy('t.name')

Но тут возникают проблемы: список сортируется неправильно, независимо от активной культуры.Я получаю несколько лучшие результаты, когда ограничиваю переводы активной культурой, например:

->leftJoin('f.Translation t WITH lang = ?', $request->getParameter('sf_culture');

Тогда сортировка верна, поскольку все переводы существуют для активной культуры.Если перевода не существует, и мне нужно взять имя из запасного языка, запись будет отображаться в самом начале списка (я так понимаю, это происходит потому, что значение для текущей культуры равно нулю).Мой вопрос: есть ли лучшая практика для правильной сортировки интернационализированных полей (нуждающихся в запасных версиях) с помощью doctrine и sfDoctrinePager?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 21 марта 2010
  1. Создать запрос DQL, который возвращает основной и резервный язык: ->innerJoin('f.Translation ft WITH ft.lang IN(?)', array(array('pl', 'en'))
  2. Убедитесь, что основной язык отсортирован перед резервным: ->orderBy('FIELD(ft.lang, "pl", "en")
  3. Теперь вы можете добавить ->orderBy('ft.name'), и все должно работать как положено.

Используйте sfDoctrinePager :: setQuery () или sfDoctrinePager :: setTableMethod () для передачи запроса на пейджер.

1 голос
/ 21 марта 2010

Я бы второй ответ Крозина, хотя я удивлен, что сортировка не работает должным образом (при условии, что вы i18n таблицы были настроены правильно в соответствии с правилами Symfony).

Как альтернативный подход к откатамв некоторых случаях, если переводы не всегда существуют или вы не можете или не хотите возвращать два результата, и если объем данных, содержащихся в таблице переводов, не очень велик, вы также можете дублировать данные в базе данных для каждого языкас перезаписью переводов для тех полей, для которых они доступны.Таким образом, один языковой критерий всегда будет возвращать результат - по умолчанию или переведенный.Это не самое чистое решение с точки зрения хранения данных, но оно может подойти для некоторых конкретных случаев.

0 голосов
/ 27 сентября 2011

Использовать культуру в запросе:

$q = Doctrine::getTable('Foo')
    ->createQuery('f')
    ->leftJoin('f.Translation t')
    ->where('t.lang = ?', sfContext::getInstance()->getUser()->getCulture())
    ->orderBy('t.name')
...