TbHtml::controlGroup PHP Method

controlGroup() public static method

Generates a form group.
public static controlGroup ( string $type, string $name, string $value = '', array $htmlOptions = [], array $data = [] ) : string
$type string the input type.
$name string the input name.
$value string the input value.
$htmlOptions array additional HTML attributes.
$data array data for multiple select inputs.
return string the generated control group.
    public static function controlGroup($type, $name, $value = '', $htmlOptions = array(), $data = array())
    {
        $color = TbArray::popValue('color', $htmlOptions);
        $groupOptions = TbArray::popValue('groupOptions', $htmlOptions, array());
        $controlOptions = TbArray::popValue('controlOptions', $htmlOptions, array());
        $label = TbArray::popValue('label', $htmlOptions);
        $labelOptions = TbArray::popValue('labelOptions', $htmlOptions, array());
        // todo: remove everything that has to do with form layouts.
        $formLayout = TbArray::popValue('formLayout', $htmlOptions, self::FORM_LAYOUT_VERTICAL);
        $labelWidthClass = TbArray::popValue('labelWidthClass', $htmlOptions, self::$defaultFormLabelWidthClass);
        // Retrieve the old-style "span" option
        $span = TbArray::popValue('span', $htmlOptions);
        if (!empty($span)) {
            $controlWidthClass = 'col-md-' . $span;
        } else {
            $controlWidthClass = TbArray::popValue('controlWidthClass', $htmlOptions, self::$defaultFormControlWidthClass);
        }
        $useFormGroup = true;
        $useControls = true;
        $output = '';
        // Special label case case for individual checkboxes and radios
        if ($type == self::INPUT_TYPE_CHECKBOX || $type == self::INPUT_TYPE_RADIOBUTTON) {
            $htmlOptions['label'] = $label;
            $htmlOptions['labelOptions'] = $labelOptions;
            $htmlOptions['useContainer'] = true;
            $label = false;
            $useFormGroup = false;
        }
        // Special conditions depending on the form type
        if ($formLayout == self::FORM_LAYOUT_HORIZONTAL) {
            switch ($type) {
                case self::INPUT_TYPE_CHECKBOX:
                case self::INPUT_TYPE_RADIOBUTTON:
                    self::addCssClass(self::switchColToOffset($labelWidthClass), $controlOptions);
                    self::addCssClass(self::switchOffsetToCol($controlWidthClass), $controlOptions);
                    $useFormGroup = true;
                    break;
                default:
                    self::addCssClass(self::switchOffsetToCol($labelWidthClass), $labelOptions);
                    self::addCssClass(self::switchOffsetToCol($controlWidthClass), $controlOptions);
            }
        } elseif ($formLayout == self::FORM_LAYOUT_INLINE || $formLayout == self::FORM_LAYOUT_SEARCH) {
            switch ($type) {
                case self::INPUT_TYPE_TEXT:
                case self::INPUT_TYPE_PASSWORD:
                case self::INPUT_TYPE_URL:
                case self::INPUT_TYPE_EMAIL:
                case self::INPUT_TYPE_NUMBER:
                case self::INPUT_TYPE_RANGE:
                case self::INPUT_TYPE_DATE:
                case self::INPUT_TYPE_FILE:
                case self::INPUT_TYPE_SEARCH:
                    self::addCssClass('sr-only', $labelOptions);
                    if ($label !== null && TbArray::getValue('placeholder', $htmlOptions) !== null) {
                        $htmlOptions['placeholder'] = $label;
                    }
                    break;
                case self::INPUT_TYPE_CHECKBOX:
                case self::INPUT_TYPE_RADIOBUTTON:
                    $useControls = false;
                    break;
            }
        }
        // remove until here.
        $help = TbArray::popValue('help', $htmlOptions, '');
        $helpOptions = TbArray::popValue('helpOptions', $htmlOptions, array());
        if (!empty($help)) {
            $help = self::inputHelp($help, $helpOptions);
        }
        $input = isset($htmlOptions['input']) ? $htmlOptions['input'] : self::createInput($type, $name, $value, $htmlOptions, $data);
        if (!empty($color)) {
            self::addCssClass($color, $groupOptions);
        }
        self::addCssClass('control-label', $labelOptions);
        if ($label !== false) {
            $output .= parent::label($label, $name, $labelOptions);
        }
        if ($useControls) {
            $output .= self::controls($input . $help, $controlOptions);
        } else {
            $output .= $input;
        }
        if ($useFormGroup) {
            self::addCssClass('form-group', $groupOptions);
            return self::tag('div', $groupOptions, $output);
        } else {
            return $output;
        }
    }

Usage Example

Example #1
0
 public function testControlGroup()
 {
     $I = $this->codeGuy;
     $html = TbHtml::controlGroup(TbHtml::INPUT_TYPE_TEXT, 'text', '', array('color' => TbHtml::INPUT_COLOR_SUCCESS, 'groupOptions' => array('class' => 'group'), 'label' => 'Label text', 'labelOptions' => array('class' => 'label'), 'help' => 'Help text', 'helpOptions' => array('class' => 'help')));
     $group = $I->createNode($html, 'div.control-group');
     $I->seeNodeCssClass($group, 'success group');
     $I->seeNodeChildren($group, array('label.control-label', 'div.controls'));
     $label = $group->filter('label.control-label');
     $I->seeNodeCssClass($label, 'label');
     $I->seeNodeAttribute($label, 'for', 'text');
     $I->seeNodeText($label, 'Label text');
     $controls = $group->filter('div.controls');
     $I->seeNodeChildren($controls, array('input', 'span'));
     $input = $controls->filter('input[type=text]');
     $I->seeNodeAttributes($input, array('id' => 'text', 'name' => 'text', 'value' => ''));
     $help = $controls->filter('span.help-inline');
     $I->seeNodeCssClass($help, 'help');
     $I->seeNodeText($help, 'Help text');
     $html = TbHtml::controlGroup(TbHtml::INPUT_TYPE_RADIOBUTTON, 'radio', true, array('label' => 'Label text'));
     $group = $I->createNode($html, 'div.control-group');
     $I->seeNodeChildren($group, array('div.controls'));
     $controls = $group->filter('div.controls');
     $label = $controls->filter('label.radio');
     $I->seeNodePattern($label, '/> Label text$/');
     $radio = $label->filter('input[type=radio]');
     $I->seeNodeAttributes($radio, array('checked' => 'checked', 'id' => 'radio', 'name' => 'radio', 'value' => '1'));
 }
TbHtml