- 首页
- PHP
- Yii2:为所有表单字段配置全局模板
Yii2:为所有表单字段配置全局模板
[英] Yii2: Config global template for all forms fields
本文介绍了Yii2:为所有表单字段配置全局模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个:
<?php $form = ActiveForm::begin();?><div class="row"><div class="col-sm-6"><?= $form->field($model, 'roleId', Yii::$app->formtemplate->fieldTemplate())->dropDownList(ArrayHelper::map(Role::find()->all(), 'id', 'name'), array('prompt' => '-- 选择角色 --', 'class' => 'form-control select2'));?>
<div class="col-sm-6"><?= $form->field($model, 'published')->checkbox(['label' => ''], true)->label($model->getAttributeLabel('published'), ['class' => 'form-label semibold']);?>
我认为这是低效的,因为我必须将模板添加到每个字段(我知道我可以为每个表单添加它,但复选框有一个不同的,任何想法如何为所有表单全局设置它?不仅适用于一种形式?
目前我所做的就是创建一个名为FormTemplate的组件,避免直接在视图中写模板,这很好,但我想全局设置.
'','标签选项' =>['类' =>'表单标签半粗体']];$icon = '';$位置 = '正确';if(!empty($option['position'])) {$position = $option['position'];}if(!empty($option['icon'])) {$icon = $this->_setFieldIcon($option['icon']);}$template['template'] = '<div class="form-group">{label}<div class="form-control-wrapper form-control-icon-'.$position.'">{input}'.$icon.'<div class="error">{error}{hint}</div></div></div>';返回 $template;}私有函数 _setFieldIcon($option) {开关($选项){案例文本":$icon = '<i class="fa fa-text-width"></i>';休息;案例密码":$icon = '<i class="fa fa-key" aria-hidden="true"></i>';休息;默认:$icon = '';休息;}返回 $icon;}}
有什么想法吗?
更新
我注意到 ActiveField 是一个组件,所以也许我可以在全局配置上做到这一点?有人做过这样的事情吗?
$config = ['id' =>'基本的','basePath' =>目录名(__DIR__),'引导' =>['日志'],'组件' =>['activeField' =>['模板' =>'……']
解决方案
您可以创建您的 ActiveField
类为:-
'表单标签半粗体'];公共函数 init(){$position = ArrayHelper::remove($this->options, 'right');$icon = $this->_setFieldIcon($this->options);$this->template ='<div class="form-group">{label}<div class="form-control-wrapper form-control-icon-'.$位置.'">{输入}'.$图标.'<div class="error">{error}{hint}
';父::init();}/*** @param $option 数组* @return 字符串 HTML*/私有函数 _setFieldIcon($option) {$icon ='';switch(ArrayHelper::getValue($option,'icon','')) {案例文本":$icon = '<i class="fa fa-text-width"></i>';休息;案例密码":$icon = '<i class="fa fa-key" aria-hidden="true"></i>';休息;}返回 $icon;}}
在 ActiveForm
中使用你的类:-
<?php $form = ActiveForm::begin([//用你的活动字段类改变它'fieldClass' =>'前端\小部件\MyActiveField']);?><div class="row"><div class="col-sm-6"><?= $form->field($model, 'roleId',['选项' =>['图标' =>'' ,'位置' =>'']])-> dropDownList(ArrayHelper::map(Role::find()->all(), 'id', 'name'), ['提示' =>'-- 选择角色--', 'class' =>'表单控件选择2']);?><div class="col-sm-6"><?= $form->field($model, 'published' ,['icon' => '' ,'position' => ''])->checkbox(['label' =>''], 真的)->label($model->getAttributeLabel('published'), ['class' => 'form-label semibold']);?>
<?php ActiveForm::end();?>
I have this:
<?php
use app\models\Location;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use app\models\Role;
?>
<?php $form = ActiveForm::begin(); ?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($model, 'roleId', Yii::$app->formtemplate->fieldTemplate())->dropDownList(ArrayHelper::map(Role::find()->all(), 'id', 'name'), array('prompt' => '-- Select a role --', 'class' => 'form-control select2')); ?>
</div>
<div class="col-sm-6">
<?= $form->field($model, 'published')->checkbox(['label' => ''], true)->label($model->getAttributeLabel('published'), ['class' => 'form-label semibold']); ?>
</div>
</div>
I think this is unefficient since I have to add the template to each field (I know I can add it per form, but checkbox has a different one, any ideas how to set it globally, for all forms? not only for one form?
So far what I have done is to create a component called FormTemplate to avoid writing the template directly in the view, which is good, but I want to set it globally.
<?php
namespace app\components;
use Yii;
use yii\base\Component;
class FormTemplate extends Component {
public function fieldTemplate($option = []) {
$template = [
'template' => '',
'labelOptions' => [ 'class' => 'form-label semibold']
];
$icon = '';
$position = 'right';
if(!empty($option['position'])) {
$position = $option['position'];
}
if(!empty($option['icon'])) {
$icon = $this->_setFieldIcon($option['icon']);
}
$template['template'] = '<div class="form-group">{label}<div class="form-control-wrapper form-control-icon-'.$position.'">{input}'.$icon.'<div class="error">{error}{hint}</div></div></div>';
return $template;
}
private function _setFieldIcon($option) {
switch($option) {
case 'text':
$icon = '<i class="fa fa-text-width"></i>';
break;
case 'password':
$icon = '<i class="fa fa-key" aria-hidden="true"></i>';
break;
default:
$icon = '';
break;
}
return $icon;
}
}
Any ideas?
UPDATE
I have noticed ActiveField is a component, so maybe I could do it on global config? someone has done something like that?
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'activeField' => [
'template' => '...'
]
解决方案
You can create
your ActiveField
class as :-
<?php
namespace frontend\widgets;
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveField;
class MyActiveField extends ActiveField
{
public $labelOptions = [ 'class' => 'form-label semibold'];
public function init()
{
$position = ArrayHelper::remove($this->options, 'right');
$icon = $this->_setFieldIcon($this->options);
$this->template ='
<div class="form-group">{label}
<div class="form-control-wrapper form-control-icon-'.
$position.'">
{input}'.$icon.
'<div class="error">{error}{hint}
</div>
</div>
</div>';
parent::init();
}
/**
* @param $option array
* @return string HTML
*/
private function _setFieldIcon($option) {
$icon ='';
switch(ArrayHelper::getValue($option ,'icon' ,'')) {
case 'text':
$icon = '<i class="fa fa-text-width"></i>';
break;
case 'password':
$icon = '<i class="fa fa-key" aria-hidden="true"></i>';
break;
}
return $icon;
}
}
And In ActiveForm
use your class as : -
<?php $form = ActiveForm::begin([
//change this with your active field class
'fieldClass' => 'frontend\widgets\MyActiveField'
]); ?>
<div class="row">
<div class="col-sm-6">
<?= $form->field($model, 'roleId',[
'options' => ['icon' => '' ,'position' => '']]
)->dropDownList(ArrayHelper::map(Role::find()->all(), 'id', 'name'), [
'prompt' => '-- Select a role --', 'class' => 'form-control select2'
]); ?>
</div>
<div class="col-sm-6">
<?= $form->field($model, 'published' ,['icon' => '' ,'position' => ''])->checkbox(['label' => ''], true)
->label($model->getAttributeLabel('published'), ['class' => 'form-label semibold']); ?>
</div>
</div>
<?php ActiveForm::end(); ?>
这篇关于Yii2:为所有表单字段配置全局模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文