2016-08-05 4 views
0

Я пытаюсь создать элемент «автозаполнения» с помощью Yii2, и поскольку я не смог найти фактический ответ на свой вопрос, я подумал, что попробую его здесь.Yii2 - автоматически генерировать атрибут placeholder

К примеру, у меня есть это поле:

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

Однако в этом случае, очевидно, оказывает «имя» в атрибуте заполнителя. Но я хотел бы, чтобы сгенерировать заполнитель атрибутов автоматически в зависимости от model «переменной s я использую, заставляя его, чтобы сделать следующее:

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

Есть известный способ доступа и вставив form->field» S атрибут и отображение его внутри его собственного элемента?

ответ

0

Да, мы можем сделать, указав метки атрибутов в файле модели, как показано ниже.

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

, то вы можете получить ярлык автоматически на основе полей, подобных следующим.

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

Я надеюсь, что это разобратся с вашей проблемой.

+0

Я действительно надеялся на способ заполнить заполнитель с помощью атрибута self decliring, такого как {attribute}, но, я думаю, нет другого способа, кроме как заполнить их вручную. –

+0

@BRO_THOM да. как шаблон, нет возможности настроить, насколько я знаю. –

+0

Такой позор. Это будет безопасно для меня много времени, будучи разработчиком интерфейса, заполняющим заполнители, как просто раздражающий. Но что есть, то есть. Спасибо за помощь, хотя! –

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 по умолчанию), и там должен быть местозаполнитель.