From fb6f5a609248eace9cca69fd386ae428b696139a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20H=C3=A4rtl?= Date: Wed, 4 Jun 2014 15:35:52 +0200 Subject: [PATCH] Fix label() method and make more templates configurable --- ActiveField.php | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 10 deletions(-) diff --git a/ActiveField.php b/ActiveField.php index d5b578d..3078169 100644 --- a/ActiveField.php +++ b/ActiveField.php @@ -35,8 +35,16 @@ use yii\helpers\ArrayHelper; * The wrapper tag is only used for some layouts and form elements. * * Note that some elements use slightly different defaults for [[template]] and other options. - * In particular the elements are [[checkbox()]], [[checkboxList()]] and [[radioList()]]. - * So to further customize these elements you may want to pass your custom options. + * You may want to override those predefined templates for checkboxes, radio buttons, checkboxLists + * and radioLists in the [[\yii\widgets\ActiveForm::fieldConfig|fieldConfig]] of the + * [[\yii\widgets\ActiveForm]]: + * + * - [[checkboxTemplate]] the template for checkboxes in default layout + * - [[radioTemplate]] the template for radio buttons in default layout + * - [[horizontalCheckboxTemplate]] the template for checkboxes in horizontal layout + * - [[horizontalRadioTemplate]] the template for radio buttons in horizontal layout + * - [[inlineCheckboxListTemplate]] the template for inline checkboxLists + * - [[inlineRadioListTemplate]] the template for inline radioLists * * Example: * @@ -109,6 +117,36 @@ class ActiveField extends \yii\widgets\ActiveField public $horizontalCssClasses; /** + * @var string the template for checkboxes in default layout + */ + public $checkboxTemplate = "
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n
"; + + /** + * @var string the template for radios in default layout + */ + public $radioTemplate = "
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n
"; + + /** + * @var string the template for checkboxes in horizontal layout + */ + public $horizontalCheckboxTemplate = "{beginWrapper}\n
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n
\n{error}\n{endWrapper}\n{hint}"; + + /** + * @var string the template for radio buttons in horizontal layout + */ + public $horizontalRadioTemplate = "{beginWrapper}\n
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n
\n{error}\n{endWrapper}\n{hint}"; + + /** + * @var string the template for inline checkboxLists + */ + public $inlineCheckboxListTemplate = "{label}\n{beginWrapper}\n{input}\n{error}\n{endWrapper}\n{hint}"; + + /** + * @var string the template for inline radioLists + */ + public $inlineRadioListTemplate = "{label}\n{beginWrapper}\n{input}\n{error}\n{endWrapper}\n{hint}"; + + /** * @var bool whether to render the error. Default is `true` except for layout `inline`. */ public $enableError = true; @@ -167,16 +205,15 @@ class ActiveField extends \yii\widgets\ActiveField { if ($enclosedByLabel) { if (!isset($options['template'])) { - if ($this->form->layout === 'horizontal') { - $this->template = "{beginWrapper}\n
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n
\n{error}\n{endWrapper}\n{hint}"; - Html::addCssClass($this->wrapperOptions, $this->horizontalCssClasses['offset']); - } else { - $this->template = "
\n{beginLabel}\n{input}\n{labelTitle}\n{endLabel}\n{error}\n{hint}\n
"; - } + $this->template = $this->form->layout === 'horizontal' ? + $this->horizontalCheckboxTemplate : $this->checkBoxTemplate; } else { $this->template = $options['template']; unset($options['template']); } + if ($this->form->layout === 'horizontal') { + Html::addCssClass($this->wrapperOptions, $this->horizontalCssClasses['offset']); + } $this->labelOptions['class'] = null; } @@ -187,11 +224,34 @@ class ActiveField extends \yii\widgets\ActiveField /** * @inheritdoc */ + public function radio($options = [], $enclosedByLabel = true) + { + if ($enclosedByLabel) { + if (!isset($options['template'])) { + $this->template = $this->form->layout === 'horizontal' ? + $this->horizontalRadioTemplate : $this->radioTemplate; + } else { + $this->template = $options['template']; + unset($options['template']); + } + if ($this->form->layout === 'horizontal') { + Html::addCssClass($this->wrapperOptions, $this->horizontalCssClasses['offset']); + } + $this->labelOptions['class'] = null; + } + + parent::radio($options, false); + return $this; + } + + /** + * @inheritdoc + */ public function checkboxList($items, $options = []) { if ($this->inline) { if (!isset($options['template'])) { - $this->template = "{label}\n{beginWrapper}\n{input}\n{error}\n{endWrapper}\n{hint}"; + $this->template = $this->inlineCheckboxListTemplate; } else { $this->template = $options['template']; unset($options['template']); @@ -214,7 +274,7 @@ class ActiveField extends \yii\widgets\ActiveField { if ($this->inline) { if (!isset($options['template'])) { - $this->template = "{label}\n{beginWrapper}\n{input}\n{error}\n{endWrapper}\n{hint}"; + $this->template = $this->inlineRadioListTemplate; } else { $this->template = $options['template']; unset($options['template']); @@ -241,6 +301,7 @@ class ActiveField extends \yii\widgets\ActiveField Html::addCssClass($this->wrapperOptions, $this->horizontalCssClasses['offset']); } } else { + $this->enableLabel = true; $this->renderLabelParts($label, $options); parent::label($label, $options); }