Yii2:为所有表单字段配置全局模板 [英] Yii2: Config global template for all forms fields

查看:20
本文介绍了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屋!

查看全文
相关文章
PHP最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆