Добавление меток атрибутов в DynamicModel Yii

У меня динамическое количество вопросов и ответов. Я использую DynamicModel() для сбора этих данных.

$attributes = [
      "answer_1" => "Some Value 1",
      "answer_2" => "Some Value 2",
      "answer_3" => "Some Value 3",
      .....
]

$customFormModel = new DynamicModel($attributes);

у меня тоже есть

$labels = [
      "answer_1" => "Label 1",
      "answer_2" => "Label 2",
      "answer_3" => "Label 3",
      .....         
]

Я просто не могу получить массив $label для атрибутов Label для моей динамической модели. Мой $customFormModel->attributeLabels() всегда пуст.

Эти результаты со следующей проблемой. Я получаю сообщения об ошибках, подобные этим

Answer 1 can not be blank
Answer 2 can not be blank
Answer 3 can not be blank

Что я хочу вместо

Label 1 can not be blank
Label 2 can not be blank
Label 3 can not be blank

3 ответа

Вы можете просто расширить DynamicModel следующим образом:

class MyDynamicModel extends DynamicModel
{
    public $attributeLabels = [];

    public function attributeLabels(){   
        return $this->attributeLabels;
    }
}

теперь вы можете установить $attributeLabels как массив

Попробуй это

$customFormAttributes = array_map(function ($key) use ($attributes) {
    return $attributes[$key];
}, array_flip($labels));

$customFormModel = new DynamicModel($customFormAttributes);

Похоже, вы неправильно используете DynamicModel Концепция здесь. Это следует использовать для специальной проверки, а также для обработки представления формы. Если вам нужно добавить ярлыки, используйте регулярно Model вместо.

Вы можете продлить DynamicModel и добавить attributeLabels() там и используйте ваш новый метод вместо этого. Но какой смысл использовать DynamicModel, когда вы можете просто создать обычную модель со всем готовым к использованию?

Для пользовательской метки атрибута вы можете добавить ActiveField метод виджета label()

<?= $form->field($customFormModel, 'attribute')->label('...') ?>

или статический эквивалент от Html учебный класс Html::label(), Html::activeLabel(),

Другие вопросы по тегам