Есть лучший способ перевести результаты запроса, используя yii2tech \ spreadsheet \ Spreadsheet - PullRequest
0 голосов
/ 02 июня 2018

Я делаю ручной запрос.Вы можете легко перевести имена столбцов, но я не могу сделать это с результатами столбцов несколько более эффективным способом.Результаты печатаются в Excel с помощью yii2tech\spreadsheet\Spreadsheet.

Подготовка запроса

$columns = [
  [
    'attribute' => 'description',
    'label' => Yii::t('data', 'Description')
  ],
  [
    'attribute' => 'type',
    'label' => Yii::t('data', 'Type')
  ]
];

$query
  ->addSelect(['description' => 'data.description'])
  ->addSelect(['type' => 'data.type'])
  ->from('data')

$rows = $query->all();

Пока я делаю запрос.Ниже приведен мой способ перевода результатов столбца type.Потому что они могут быть просто некоторыми значениями.

Перевод результатов

foreach ($rows as $key => $row) {
  $rows[$key]['type'] = Yii::t('data', $row['type']);
}

Эти данные экспортируются в формат xls:

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

$exporter = new Spreadsheet([
  'dataProvider' => new ArrayDataProvider([
    'allModels' => $rows,
  ]),
  'columns' => $columns,
]);

1 Ответ

0 голосов
/ 02 июня 2018

Вы можете определить перевод внутри объявления $columns - он сохранит ваш массив результатов ручной итерации для замены типа переведенной строкой:

$columns = [
    [
        'attribute' => 'description',
        'label' => Yii::t('data', 'Description'),
    ],
    [
        'attribute' => 'type',
        'label' => Yii::t('data', 'Type'),
        'value' => function ($data) {
            return Yii::t('data', $data['type']);
        }
    ],
];

Если лист большой и типы часто повторяются, выможет попытаться кэшировать переведенную строку - Yii::t() может быть довольно дорогим:

$columns = [
    [
        'attribute' => 'description',
        'label' => Yii::t('data', 'Description'),
    ],
    [
        'attribute' => 'type',
        'label' => Yii::t('data', 'Type'),
        'value' => function ($data) {
            static $translations = [];
            if (!isset($translations[$data['type']])) {
                $translations[$data['type']] = Yii::t('data', $data['type']);
            }

            return $translations[$data['type']];
        },
    ],
];

Это вызовет Yii::t() только один раз для уникального типа.Но если список типов небольшой и жестко запрограммирован, вы можете упростить это еще больше - создайте getTranslatedTypes() статический метод, который возвращает переведенный список всех типов:

public static function getTranslatedTypes() {
    return [
        'some type' => Yii::t('data', 'some type'),
        // ...
    ];
}

И используйте его в качестве источника переводов:

$translations = Type::getTranslatedTypes();
$columns = [
    [
        'attribute' => 'description',
        'label' => Yii::t('data', 'Description'),
    ],
    [
        'attribute' => 'type',
        'label' => Yii::t('data', 'Type'),
        'value' => function ($data) use ($translations) {
            return $translations[$data['type']] ?? $data['type'];
        },
    ],
];
...