diff --git a/src/BaseHtml.php b/src/BaseHtml.php index 1baf6df..2081786 100644 --- a/src/BaseHtml.php +++ b/src/BaseHtml.php @@ -28,14 +28,10 @@ abstract class BaseHtml extends \yii\helpers\Html */ public static $autoIdPrefix = 'i'; /** - * @var bool whether to removes duplicate class names in tag attribute `class` (fix strange yii2 behavior since 2.0.44) - * @see mergeCssClasses() - * @see renderTagAttributes() - * @since 2.0.3 + * @inheritDoc */ public static $normalizeClassAttribute = true; - /** * Renders Bootstrap static form control. * @@ -56,6 +52,7 @@ abstract class BaseHtml extends \yii\helpers\Html /** * Generates a Bootstrap static form control for the given model attribute. + * * @param Model $model the model object. * @param string $attribute the attribute name or expression. See [[getAttributeName()]] for the format * about attribute expression. @@ -76,24 +73,33 @@ abstract class BaseHtml extends \yii\helpers\Html } /** - * {@inheritDoc} + * {@inheritdoc} + * Pass `true` in `$options['inline']` to generate {@see https://getbootstrap.com/docs/5.1/forms/checks-radios/#inline inline list}. */ public static function radioList($name, $selection = null, $items = [], $options = []): string { + $inline = ArrayHelper::remove($options, 'inline', false); + if (!isset($options['item'])) { $itemOptions = ArrayHelper::remove($options, 'itemOptions', []); - $encode = ArrayHelper::getValue($options, 'encode', true); - $options['item'] = function ($index, $label, $name, $checked, $value) use ($itemOptions, $encode) { - unset($index); - $options = array_merge( - [ - 'class' => 'form-check-input', - 'label' => $encode ? static::encode($label) : $label, - 'labelOptions' => ['class' => 'form-check-label'], - 'value' => $value, - ], $itemOptions); + static::addCssClass($itemOptions, ['bootstrap' => 'form-check-input']); + if (!isset($itemOptions['labelOptions'])) { + $itemOptions['labelOptions'] = ['class' => 'form-check-label']; + } else { + static::addCssClass($itemOptions['labelOptions'], ['bootstrap' => 'form-check-label']); + } - return '
' . static::radio($name, $checked, $options) . '
'; + $wrapperOptions = $inline ? ['class' => 'form-check form-check-inline'] : ['class' => 'form-check']; + + $encode = ArrayHelper::getValue($options, 'encode', true); + + $options['item'] = function ($index, $label, $name, $checked, $value) use ($itemOptions, $wrapperOptions, $encode) { + $itemOptions['value'] = $value; + if (!isset($itemOptions['label'])) { + $itemOptions['label'] = $encode ? static::encode($label) : $label; + } + + return static::tag('div', static::radio($name, $checked, $itemOptions), $wrapperOptions); }; } @@ -102,23 +108,32 @@ abstract class BaseHtml extends \yii\helpers\Html /** * {@inheritdoc} + * Pass `true` in `$options['inline']` to generate {@see https://getbootstrap.com/docs/5.1/forms/checks-radios/#inline inline list}. */ public static function checkboxList($name, $selection = null, $items = [], $options = []): string { + $inline = ArrayHelper::remove($options, 'inline', false); + if (!isset($options['item'])) { $itemOptions = ArrayHelper::remove($options, 'itemOptions', []); - $encode = ArrayHelper::getValue($options, 'encode', true); - $options['item'] = function ($index, $label, $name, $checked, $value) use ($itemOptions, $encode) { - unset($index); - $options = array_merge( - [ - 'class' => 'form-check-input', - 'label' => $encode ? static::encode($label) : $label, - 'labelOptions' => ['class' => 'form-check-label'], - 'value' => $value, - ], $itemOptions); + static::addCssClass($itemOptions, 'form-check-input'); + if (!isset($itemOptions['labelOptions'])) { + $itemOptions['labelOptions'] = ['class' => 'form-check-label']; + } else { + static::addCssClass($itemOptions['labelOptions'], 'form-check-label'); + } - return '
' . Html::checkbox($name, $checked, $options) . '
'; + $wrapperOptions = $inline ? ['class' => 'form-check form-check-inline'] : ['class' => 'form-check']; + + $encode = ArrayHelper::getValue($options, 'encode', true); + + $options['item'] = function ($index, $label, $name, $checked, $value) use ($itemOptions, $wrapperOptions, $encode) { + $itemOptions['value'] = $value; + if (!isset($itemOptions['label'])) { + $itemOptions['label'] = $encode ? static::encode($label) : $label; + } + + return static::tag('div', static::checkbox($name, $checked, $itemOptions), $wrapperOptions); }; } @@ -130,15 +145,13 @@ abstract class BaseHtml extends \yii\helpers\Html */ public static function error($model, $attribute, $options = []): string { - if (!array_key_exists('class', $options)) { - $options['class'] = ['invalid-feedback']; - } + static::addCssClass($options, 'invalid-feedback'); return parent::error($model, $attribute, $options); } /** - * @inheritdoc + * {@inheritdoc} */ protected static function booleanInput($type, $name, $checked = false, $options = []): string {