2016-08-05 111 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是默认值),占位符应该在那里。