2016-08-05 73 views
0

我試圖創建一個使用Yii2的'自動佔位符'元素,因爲我找不到我的問題的實際答案,我以爲我會在這裏嘗試。Yii2 - 自動生成佔位符屬性

例如,我有這樣的領域:

<?= $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的已知方法的屬性並在其內部顯示它?

回答

0

是的,我們可以通過在下面的模型文件中定義屬性標籤來完成。

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

然後您可以根據以下字段自動獲取標籤。

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

我希望這會將您的問題整理出來。

+0

我實際上希望有一種方法來填充自定義屬性(如{屬性})的佔位符,但我想除了手動填寫它們之外別無它法。 –

+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是默認值),佔位符應該在那裏。