You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.7 KiB
160 lines
4.7 KiB
<?php |
|
/** |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright (c) 2008 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
*/ |
|
|
|
namespace yii\bootstrap; |
|
|
|
use yii\helpers\ArrayHelper; |
|
use yii\helpers\Url; |
|
|
|
/** |
|
* ButtonDropdown renders a group or split button dropdown bootstrap component. |
|
* |
|
* For example, |
|
* |
|
* ```php |
|
* // a button group using Dropdown widget |
|
* echo ButtonDropdown::widget([ |
|
* 'label' => 'Action', |
|
* 'dropdown' => [ |
|
* 'items' => [ |
|
* ['label' => 'DropdownA', 'url' => '/'], |
|
* ['label' => 'DropdownB', 'url' => '#'], |
|
* ], |
|
* ], |
|
* ]); |
|
* ``` |
|
* @see http://getbootstrap.com/javascript/#buttons |
|
* @see http://getbootstrap.com/components/#btn-dropdowns |
|
* @author Antonio Ramirez <amigo.cobos@gmail.com> |
|
* @since 2.0 |
|
*/ |
|
class ButtonDropdown extends Widget |
|
{ |
|
/** |
|
* @var string the button label |
|
*/ |
|
public $label = 'Button'; |
|
/** |
|
* @var array 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 \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. |
|
* @since 2.0.1 |
|
*/ |
|
public $containerOptions = []; |
|
/** |
|
* @var array the HTML attributes of the button. |
|
* @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. |
|
*/ |
|
public $options = []; |
|
/** |
|
* @var array the configuration array for [[Dropdown]]. |
|
*/ |
|
public $dropdown = []; |
|
/** |
|
* @var bool whether to display a group of split-styled button group. |
|
*/ |
|
public $split = false; |
|
/** |
|
* @var string the tag to use to render the button |
|
*/ |
|
public $tagName = 'button'; |
|
/** |
|
* @var bool whether the label should be HTML-encoded. |
|
*/ |
|
public $encodeLabel = true; |
|
/** |
|
* @var string name of a class to use for rendering dropdowns withing this widget. Defaults to [[Dropdown]]. |
|
* @since 2.0.7 |
|
*/ |
|
public $dropdownClass = 'yii\bootstrap\Dropdown'; |
|
|
|
|
|
/** |
|
* Renders the widget. |
|
*/ |
|
public function run() |
|
{ |
|
// @todo use [[options]] instead of [[containerOptions]] and introduce [[buttonOptions]] before 2.1 release |
|
Html::addCssClass($this->containerOptions, ['widget' => 'btn-group']); |
|
$options = $this->containerOptions; |
|
$tag = ArrayHelper::remove($options, 'tag', 'div'); |
|
|
|
$this->registerPlugin('dropdown'); |
|
return implode("\n", [ |
|
Html::beginTag($tag, $options), |
|
$this->renderButton(), |
|
$this->renderDropdown(), |
|
Html::endTag($tag) |
|
]); |
|
} |
|
|
|
/** |
|
* Generates the button dropdown. |
|
* @return string the rendering result. |
|
*/ |
|
protected function renderButton() |
|
{ |
|
Html::addCssClass($this->options, ['widget' => 'btn']); |
|
$label = $this->label; |
|
if ($this->encodeLabel) { |
|
$label = Html::encode($label); |
|
} |
|
|
|
if ($this->split) { |
|
$options = $this->options; |
|
$this->options['data-toggle'] = 'dropdown'; |
|
Html::addCssClass($this->options, ['toggle' => 'dropdown-toggle']); |
|
unset($options['id']); |
|
$splitButton = Button::widget([ |
|
'label' => '<span class="caret"></span>', |
|
'encodeLabel' => false, |
|
'options' => $this->options, |
|
'view' => $this->getView(), |
|
]); |
|
} else { |
|
$label .= ' <span class="caret"></span>'; |
|
$options = $this->options; |
|
Html::addCssClass($options, ['toggle' => 'dropdown-toggle']); |
|
$options['data-toggle'] = 'dropdown'; |
|
$splitButton = ''; |
|
} |
|
|
|
if (isset($options['href'])) { |
|
if (is_array($options['href'])) { |
|
$options['href'] = Url::to($options['href']); |
|
} |
|
} else { |
|
if ($this->tagName === 'a') { |
|
$options['href'] = '#'; |
|
} |
|
} |
|
|
|
return Button::widget([ |
|
'tagName' => $this->tagName, |
|
'label' => $label, |
|
'options' => $options, |
|
'encodeLabel' => false, |
|
'view' => $this->getView(), |
|
]) . "\n" . $splitButton; |
|
} |
|
|
|
/** |
|
* Generates the dropdown menu. |
|
* @return string the rendering result. |
|
*/ |
|
protected function renderDropdown() |
|
{ |
|
$config = $this->dropdown; |
|
$config['clientOptions'] = false; |
|
$config['view'] = $this->getView(); |
|
/** @var Widget $dropdownClass */ |
|
$dropdownClass = $this->dropdownClass; |
|
return $dropdownClass::widget($config); |
|
} |
|
}
|
|
|