Alert.php 3.49 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([
Antonio Ramirez committed
21
 *     'body' => 'Say hello...',
Alexander Makarov committed
22
 *     'closeButton' => [
Antonio Ramirez committed
23
 *         'label' => '&times;',
24
 *         'tag' => 'a',
Alexander Makarov committed
25 26
 *     ],
 * ]);
Antonio Ramirez committed
27 28 29 30 31 32
 * ```
 *
 * The following example will show the content enclosed between the [[begin()]]
 * and [[end()]] calls within the alert box:
 *
 * ```php
Alexander Makarov committed
33 34 35
 * Alert::begin([
 *     'closeButton' => ['label' => '&times;'],
 * ]);
Antonio Ramirez committed
36 37 38 39 40 41
 *
 * echo 'Say hello...';
 *
 * Alert::end();
 * ```
 *
42
 * @see http://twitter.github.io/bootstrap/javascript.html#alerts
Antonio Ramirez committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
 * @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.
	 * Please refer to the [Alert plugin help](http://twitter.github.com/bootstrap/javascript.html#alerts)
	 * for the supported HTML attributes.
	 */
Alexander Makarov committed
68
	public $closeButton = [];
Antonio Ramirez committed
69

70

Antonio Ramirez committed
71 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
	/**
	 * 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()
	{
Alexander Makarov committed
137
		$this->options = array_merge(['class' => 'fade in'], $this->options);
Antonio Ramirez committed
138

139
		Html::addCssClass($this->options, 'alert');
Antonio Ramirez committed
140 141

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