Class yii\bootstrap5\ButtonDropdown

Inheritanceyii\bootstrap5\ButtonDropdown » yii\bootstrap5\Widget » yii\base\Widget
Uses Traitsyii\bootstrap5\BootstrapWidgetTrait
Source Code https://github.com/yiisoft/yii2-bootstrap5/blob/master/src/ButtonDropdown.php

ButtonDropdown renders a group or split button dropdown bootstrap component.

For example,

// a button group using Dropdown widget
echo ButtonDropdown::widget([
    'label' => 'Action',
    'dropdown' => [
        'items' => [
            ['label' => 'DropdownA', 'url' => '/'],
            ['label' => 'DropdownB', 'url' => '#'],
        ],
    ],
]);

See also:

Public Properties

Hide inherited properties

Property Type Description Defined By
$buttonOptions array The HTML attributes of the button. yii\bootstrap5\ButtonDropdown
$clientEvents array The event handlers for the underlying Bootstrap JS plugin. yii\bootstrap5\BootstrapWidgetTrait
$clientOptions array|false The options for the underlying Bootstrap JS plugin/component. yii\bootstrap5\BootstrapWidgetTrait
$direction string The drop-direction of the widget Possible values are 'left', 'right', 'up', or 'down' (default) yii\bootstrap5\ButtonDropdown
$dropdown array The configuration array for yii\bootstrap5\Dropdown. yii\bootstrap5\ButtonDropdown
$dropdownClass string Name of a class to use for rendering dropdowns withing this widget. yii\bootstrap5\ButtonDropdown
$encodeLabel boolean Whether the label should be HTML-encoded. yii\bootstrap5\ButtonDropdown
$label string|null The button label yii\bootstrap5\ButtonDropdown
$options array The HTML attributes for the container tag. yii\bootstrap5\ButtonDropdown
$renderContainer boolean Whether to render the container using the $options as HTML attributes. yii\bootstrap5\ButtonDropdown
$split boolean Whether to display a group of split-styled button group. yii\bootstrap5\ButtonDropdown
$tagName string The tag to use to render the button yii\bootstrap5\ButtonDropdown

Protected Methods

Hide inherited methods

Method Description Defined By
registerClientEvents() Registers JS event handlers that are listed in $clientEvents. yii\bootstrap5\BootstrapWidgetTrait
registerPlugin() Registers a specific Bootstrap plugin/component and the related events. yii\bootstrap5\BootstrapWidgetTrait
renderButton() Generates the button dropdown. yii\bootstrap5\ButtonDropdown
renderDropdown() Generates the dropdown menu. yii\bootstrap5\ButtonDropdown

Constants

Hide inherited constants

Constant Value Description Defined By
DIRECTION_DOWN 'down' The css class part of dropdown yii\bootstrap5\ButtonDropdown
DIRECTION_LEFT 'left' The css class part of dropleft yii\bootstrap5\ButtonDropdown
DIRECTION_RIGHT 'right' The css class part of dropright yii\bootstrap5\ButtonDropdown
DIRECTION_UP 'up' The css class part of dropup yii\bootstrap5\ButtonDropdown

Property Details

Hide inherited properties

$buttonOptions public property

The HTML attributes of the button.

See also \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered.

public array $buttonOptions = []
$direction public property

The drop-direction of the widget

Possible values are 'left', 'right', 'up', or 'down' (default)

public string $direction self::DIRECTION_DOWN
$dropdown public property

The configuration array for yii\bootstrap5\Dropdown.

public array $dropdown = []
$dropdownClass public property

Name of a class to use for rendering dropdowns withing this widget. Defaults to yii\bootstrap5\Dropdown.

public string $dropdownClass = \yii\bootstrap5\Dropdown::class
$encodeLabel public property

Whether the label should be HTML-encoded.

public boolean $encodeLabel true
$label public property

The button label

public string|null $label null
$options public property

The HTML attributes for the container tag. The following special options are recognized:

  • tag: string, defaults to "div", the name of the container tag.

See also \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered.

public array $options = []
$renderContainer public property

Whether to render the container using the $options as HTML attributes. If set to false, the container element enclosing the button and dropdown will NOT be rendered.

public boolean $renderContainer true
$split public property

Whether to display a group of split-styled button group.

public boolean $split false
$tagName public property

The tag to use to render the button

public string $tagName 'button'

Method Details

Hide inherited methods

init() public method

public void init ( )

                public function init(): void
{
    parent::init();
    if (!isset($this->buttonOptions['id'])) {
        $this->buttonOptions['id'] = $this->options['id'] . '-button';
    }
    if ($this->label === null) {
        $this->label = Yii::t('yii/bootstrap5', 'Button');
    }
}

            
registerClientEvents() protected method

Defined in: yii\bootstrap5\BootstrapWidgetTrait::registerClientEvents()

Registers JS event handlers that are listed in $clientEvents.

protected void registerClientEvents ( ?string $name null )
$name ?string

                protected function registerClientEvents(?string $name = null): void
{
    if (!empty($this->clientEvents)) {
        $id = $this->options['id'];
        $js = [];
        $appendix = ($name === 'dropdown') ? '.parentElement' : '';
        foreach ($this->clientEvents as $event => $handler) {
            $js[] = "document.getElementById('$id')$appendix.addEventListener('$event', $handler);";
        }
        $this->getView()->registerJs(implode("\n", $js));
    }
}

            
registerPlugin() protected method

Defined in: yii\bootstrap5\BootstrapWidgetTrait::registerPlugin()

Registers a specific Bootstrap plugin/component and the related events.

protected void registerPlugin ( string $name )
$name string

The name of the Bootstrap plugin

                protected function registerPlugin(string $name): void
{
    /**
     * @see https://github.com/twbs/bootstrap/blob/v5.2.0/js/index.esm.js
     */
    $jsPlugins = [
        'alert',
        'button',
        'carousel',
        'collapse',
        'dropdown',
        'modal',
        'offcanvas',
        'popover',
        'scrollspy',
        'tab',
        'toast',
        'tooltip',
    ];
    if (in_array($name, $jsPlugins, true)) {
        $view = $this->getView();
        BootstrapPluginAsset::register($view);
        // 'popover', 'toast' and 'tooltip' plugins not activates via data attributes
        if ($this->clientOptions !== false || in_array($name, ['popover', 'toast', 'tooltip'], true)) {
            $name = ucfirst($name);
            $id = $this->options['id'];
            $options = empty($this->clientOptions) ? '{}' : Json::htmlEncode($this->clientOptions);
            $view->registerJs("(new bootstrap.$name('#$id', $options));");
        }
        $this->registerClientEvents($name);
    }
}

            
renderButton() protected method

Generates the button dropdown.

protected string renderButton ( )
return string

The rendering result.

throws Throwable

                protected function renderButton(): string
{
    Html::addCssClass($this->buttonOptions, [
        'widget' => 'btn',
    ]);
    $label = $this->label;
    if ($this->encodeLabel) {
        $label = Html::encode($label);
    }
    if ($this->split) {
        $buttonOptions = $this->buttonOptions;
        $this->buttonOptions['data'] = [
            'bs-toggle' => 'dropdown',
        ];
        $this->buttonOptions['aria'] = [
            'expanded' => 'false',
        ];
        Html::addCssClass($this->buttonOptions, [
            'toggle' => 'dropdown-toggle dropdown-toggle-split',
        ]);
        unset($buttonOptions['id']);
        $splitButton = Button::widget([
            'label' => '<span class="visually-hidden">' . Yii::t('yii/bootstrap5', 'Toggle Dropdown') . '</span>',
            'encodeLabel' => false,
            'options' => $this->buttonOptions,
            'view' => $this->getView(),
        ]);
    } else {
        $buttonOptions = $this->buttonOptions;
        Html::addCssClass($buttonOptions, [
            'toggle' => 'dropdown-toggle',
        ]);
        $buttonOptions['data'] = [
            'bs-toggle' => 'dropdown',
        ];
        $buttonOptions['aria'] = [
            'expanded' => 'false',
        ];
        $splitButton = '';
    }
    if (isset($buttonOptions['href'])) {
        if (is_array($buttonOptions['href'])) {
            $buttonOptions['href'] = Url::to($buttonOptions['href']);
        }
    } else {
        if ($this->tagName === 'a') {
            $buttonOptions['href'] = '#';
            $buttonOptions['role'] = 'button';
        }
    }
    return Button::widget([
        'tagName' => $this->tagName,
        'label' => $label,
        'options' => $buttonOptions,
        'clientOptions' => false,
        'encodeLabel' => false,
        'view' => $this->getView(),
    ]) . "\n" . $splitButton;
}

            
renderDropdown() protected method

Generates the dropdown menu.

protected string renderDropdown ( )
return string

The rendering result.

throws Throwable

                protected function renderDropdown(): string
{
    $config = $this->dropdown;
    $config['clientOptions'] = [];
    $config['view'] = $this->getView();
    /** @var Widget $dropdownClass */
    $dropdownClass = $this->dropdownClass;
    return $dropdownClass::widget($config);
}

            
run() public method

public string run ( )
throws Throwable

                public function run(): string
{
    $html = $this->renderButton() . "\n" . $this->renderDropdown();
    if ($this->renderContainer) {
        Html::addCssClass($this->options, [
            'widget' => 'drop' . $this->direction,
            'btn-group',
        ]);
        $options = $this->options;
        $tag = ArrayHelper::remove($options, 'tag', 'div');
        $html = Html::tag($tag, $html, $options);
    }
    // Set options id to button options id to ensure correct css selector in plugin initialisation
    $this->options['id'] = $this->buttonOptions['id'];
    $this->registerPlugin('dropdown');
    return $html;
}