Alert.php 3.48 KB
Newer Older
Antonio Ramirez committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\bootstrap;

use Yii;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;

/**
 * Alert renders an alert bootstrap component.
 *
 * For example,
 *
 * ```php
Alexander Makarov committed
20
 * echo Alert::widget([
21 22
 *     'options' => [
 *         'class' => 'alert-info',
Alexander Makarov committed
23
 *     ],
24
 *     'body' => 'Say hello...',
Alexander Makarov committed
25
 * ]);
Antonio Ramirez committed
26 27 28 29 30 31
 * ```
 *
 * The following example will show the content enclosed between the [[begin()]]
 * and [[end()]] calls within the alert box:
 *
 * ```php
Alexander Makarov committed
32
 * Alert::begin([
33 34 35
 *     'options' => [
 *         'class' => 'alert-warning',
 *     ],
Alexander Makarov committed
36
 * ]);
Antonio Ramirez committed
37 38 39 40 41 42
 *
 * echo 'Say hello...';
 *
 * Alert::end();
 * ```
 *
43
 * @see http://getbootstrap.com/components/#alerts
Antonio Ramirez committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
 * @author Antonio Ramirez <amigo.cobos@gmail.com>
 * @since 2.0
 */
class Alert extends Widget
{
	/**
	 * @var string the body content in the alert component. Note that anything between
	 * the [[begin()]] and [[end()]] calls of the Alert widget will also be treated
	 * as the body content, and will be rendered before this.
	 */
	public $body;
	/**
	 * @var array the options for rendering the close button tag.
	 * The close button is displayed in the header of the modal window. Clicking
	 * on the button will hide the modal window. If this is null, no close button will be rendered.
	 *
	 * The following special options are supported:
	 *
	 * - tag: string, the tag name of the button. Defaults to 'button'.
	 * - label: string, the label of the button. Defaults to '&times;'.
	 *
	 * The rest of the options will be rendered as the HTML attributes of the button tag.
66
	 * Please refer to the [Alert documentation](http://getbootstrap.com/components/#alerts)
Antonio Ramirez committed
67 68
	 * for the supported HTML attributes.
	 */
Alexander Makarov committed
69
	public $closeButton = [];
Antonio Ramirez committed
70

71

Antonio Ramirez committed
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	/**
	 * Initializes the widget.
	 */
	public function init()
	{
		parent::init();

		$this->initOptions();

		echo Html::beginTag('div', $this->options) . "\n";
		echo $this->renderBodyBegin() . "\n";
	}

	/**
	 * Renders the widget.
	 */
	public function run()
	{
		echo "\n" . $this->renderBodyEnd();
		echo "\n" . Html::endTag('div');

		$this->registerPlugin('alert');
	}

	/**
	 * Renders the close button if any before rendering the content.
	 * @return string the rendering result
	 */
	protected function renderBodyBegin()
	{
		return $this->renderCloseButton();
	}

	/**
	 * Renders the alert body (if any).
	 * @return string the rendering result
	 */
	protected function renderBodyEnd()
	{
		return $this->body . "\n";
	}

	/**
	 * Renders the close button.
	 * @return string the rendering result
	 */
	protected function renderCloseButton()
	{
		if ($this->closeButton !== null) {
			$tag = ArrayHelper::remove($this->closeButton, 'tag', 'button');
			$label = ArrayHelper::remove($this->closeButton, 'label', '&times;');
			if ($tag === 'button' && !isset($this->closeButton['type'])) {
				$this->closeButton['type'] = 'button';
			}
			return Html::tag($tag, $label, $this->closeButton);
		} else {
			return null;
		}
	}

	/**
	 * Initializes the widget options.
	 * This method sets the default values for various options.
	 */
	protected function initOptions()
	{
138
		Html::addCssClass($this->options, 'alert');
139 140
		Html::addCssClass($this->options, 'fade');
		Html::addCssClass($this->options, 'in');
Antonio Ramirez committed
141 142

		if ($this->closeButton !== null) {
Alexander Makarov committed
143
			$this->closeButton = array_merge([
Antonio Ramirez committed
144 145 146
				'data-dismiss' => 'alert',
				'aria-hidden' => 'true',
				'class' => 'close',
Alexander Makarov committed
147
			], $this->closeButton);
Antonio Ramirez committed
148 149
		}
	}
150
}