我正在表中创建一个可以有 0、1、2 或 3 的列。所有这些数字都有一定的值,在我的例子中 0 = DOG,1 = CAT,2 = FISH,3 = FROG。要获取表中的名称而不是数字,我执行以下操作:
public function attributeLabels(): array
{
return [
Pet::DOG => 'Dog',
Pet::CAT => 'CAT',
Pet::FISH => 'Fish',
Pet::FROG => 'Frog',
Pet::TYPE_LAND => 'Land',
Pet::TYPE_WATER => 'Water'
}
在网格视图中
[
'attribute' => 'Animal',
'header' => Icon::show('beast', ['title' => Yii::t('backend', 'animal')]),
'value' => function ($model) use ($petSearch) {
return $petSearch->getAttributeLabel($model['Animal']);
},
'filter' => [
Pet::DOG => $PetSearch->getAttributeLabel(Pet::DOG),
Pet::CAT => $PetSearch->getAttributeLabel(Pet::CAT),
Pet::FISH => $PetSearch->getAttributeLabel(Pet::FISH),
Pet::FROG => $PetSearch->getAttributeLabel(Pet::FROG),
]
],
这应该会向我显示具有正确翻译的专栏,确实如此,但有一个问题。 Sinds TYPE_LAND 和 TYPE_WATER 也有值 0 和 1,它给了我这 2 个值的混合,所以该列没有任何意义,例如我看到的是 Land,而不是狗。我还在代码中收到以下消息:
Duplicate array key with value '0'
有没有办法让它正确工作
您不必为此使用
attributeLabels()
方法。该方法应该标记模型的属性而不是其值。
您可以创建两个公共方法来将值转换为
PetSearch
模型中的正确标签,例如如下所示:
public function animalLabel($animal) {
$map = [
Pet::DOG => 'Dog',
Pet::CAT => 'CAT',
Pet::FISH => 'Fish',
Pet::FROG => 'Frog',
Pet::TYPE_LAND => 'Land',
Pet::TYPE_WATER => 'Water',
];
if (isset($map[$animal])) {
return $map[$animal];
}
// ... do something if the value is not present in map
// for example throw an exception, return empty/default label or something...
}
public function animalTypeLabel($type) {
$map = [
Pet::TYPE_LAND => 'Land',
Pet::TYPE_WATER => 'Water'
];
if (isset($map[$type])) {
return $map[$type];
}
// ... do something if the value is not present in map
// for example throw an exception, return empty/default label or something...
}
然后在 GridView 配置中使用这些方法用标签替换数值:
[
'attribute' => 'Animal',
'header' => Icon::show('beast', ['title' => Yii::t('backend', 'animal')]),
'format' => function ($value) use ($petSearch) {
return $petSearch->animalLabel($value);
},
],
[
// asuming the type value is in `AnimalType` attribute - change to match your attribute names
'attribute' => 'AnimalType',
'header' => Icon::show('beast', ['title' => Yii::t('backend', 'animal')]),
'format' => function ($value) use ($petSearch) {
return $petSearch->animalTypeLabel($value);
},
],