Yii2 如何在 attributeLabels 函数中使用具有相同值的多个数组键

问题描述 投票:0回答:1

我正在表中创建一个可以有 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' 

有没有办法让它正确工作

php arrays function duplicates yii2
1个回答
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);
     },
],
© www.soinside.com 2019 - 2024. All rights reserved.