1

我正在尝试使用 Yii2 创建一个“自动占位符”元素,由于我找不到我的问题的实际答案,我想我会在这里尝试一下。

例如,我有这个字段:

<?= $form->field($model, 'username', 
    [
        'template'=>'{input}{label}{error}'
    ])
    ->textInput(['placeHolder'=>'{name}')
    ->label(false);
?>

但是,这种情况显然会在占位符属性中呈现“名称”。但我想根据model我正在使用的变量自动生成占位符属性,使其呈现以下内容:

<input type="text" id="loginform-username" class="form-control" name="LoginForm[username]" placeholder="Username">

是否有一种已知的访问和插入form->field' 属性并将其显示在其自己的元素中的方法?

4

2 回答 2

2

是的,我们可以通过在模型文件中定义属性标签来做到这一点,如下所示。

public function attributeLabels() {
    return [
      'username' => 'Username',
    ];
}

然后您可以根据以下字段自动获取标签。

<?= $form->field($model, 'username', 
    [
        'template'=>'{input}{label}{error}'
    ])
    ->textInput(['placeholder' => $model->getAttributeLabel('username'))
    ->label(false);
?>

我希望这能解决你的问题。

于 2016-08-05T20:38:05.257 回答
0

如果您有一些额外的麻烦,您可以为此扩展 ActiveField 类。

class MyActiveField extends \yii\widgets\ActiveField
{
    public function textInput($options = [])
    {
        if (empty($options['placeholder'])) {
            $options['placeholder'] = $this->model->getAttributeLabel($this->attribute);
        }
        return parent::textInput($options);
    }
}

现在只需要使用你的类而不是默认类。您可以在视图中执行每次操作:

<?php $form = ActiveForm::begin([
    'fieldClass' => 'fully\qualified\name\of\MyActiveField'
]); ?>

或扩展 ActiveForm:

class MyActiveForm extends \yii\widgets\ActiveForm
{
    $fieldClass = 'fully\qualified\name\of\MyActiveField';
}

并使用它代替默认的 ActiveForm 小部件:

<?php $form = MyActiveForm::begin(); ?>

现在你可以使用<?= $form->field($model, 'attribute')->textInput() ?>(或者只是<?= $form->field($model, 'attribute') ?>因为textInput是默认的)并且占位符应该在那里。

于 2016-08-06T07:22:02.947 回答