有一种更好的方法来使用yii2tech \ spreadsheet \ Spreadsheet翻译查询结果

时间:2018-06-01 23:12:01

标签: php yii2 translation spreadsheet

我正在进行手动查询。您可以轻松地翻译列的名称,但我不能以更有效的方式使用列的结果。在yii2tech\spreadsheet\Spreadsheet的帮助下,结果以excel格式打印。

准备查询

$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 :(得分:1)

您可以在$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'];
        },
    ],
];