У меня есть это:
<?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>
Я думаю, что это неэффективно, так как я должен добавить шаблон в каждое поле (я знаю, что могу добавить его в форму, но флажок имеет другой, любые идеи, как установить его глобально, для всех форм? Не только для одной формы?
До сих пор я сделал, чтобы создать компонент FormTemplate, чтобы избежать написания шаблона непосредственно в представлении, что хорошо, но я хочу установить его глобально.
<?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; } }
Есть идеи?
ОБНОВИТЬ
Я заметил, что ActiveField является компонентом, так что, возможно, я могу сделать это в глобальной конфигурации? кто-то сделал что-то подобное?
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'activeField' => [ 'template' => '...' ]
Вы можете создать свой класс ActiveField
следующим образом:
<?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; } }
И в ActiveForm
используйте свой класс как: –
<?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(); ?>
Если вы хотите настроить объекты ActiveField
для всего своего приложения, вы должны использовать контейнер для инъекций Yii2 , например:
\Yii::$container->set('yii\bootstrap\ActiveField', [ 'template' => '...', ]);
Или для ActiveForm
:
\Yii::$container->set('yii\bootstrap\ActiveForm', [ 'inputTemplate' => '...', ]);
Подробнее о практическом использовании контейнера DI .