BRO_THOM
BRO_THOM

Reputation: 851

Yii2 - automatically generate placeholder attribute

I'm trying to create an 'auto-placeholder' element using Yii2 and since I couldn't find an actual answer to my question, I thought I'd try it here.

For example, I have this field:

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

However this case would obviously render "name" in the placeholder attribute. But I would like to generate the placeholder attribute automatically depending on the model's variable I'm using, causing it to render the following:

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

Is there a known way of accessing and inserting the form->field's attribute and displaying it inside its own element?

Upvotes: 1

Views: 3641

Answers (2)

Bizley
Bizley

Reputation: 18021

If you are in for some extra hassle you can extend ActiveField class for that.

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);
    }
}

Now just need to use your class instead of default one. You can do every time in view:

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

Or extend ActiveForm:

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

and use it instead of default ActiveForm widget:

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

Now you can use <?= $form->field($model, 'attribute')->textInput() ?> (or just <?= $form->field($model, 'attribute') ?> since textInput is default) and placeholder should be there.

Upvotes: 0

Manikandan S
Manikandan S

Reputation: 922

Yes we can do by defining the attributes labels in model file like below.

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

then you can fetch the label automatically based on fields like following.

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

I hope this will sort it out your problem.

Upvotes: 2

Related Questions