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

72

Antonio Ramirez committed
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 138 139 140 141 142
	/**
	 * 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()
	{
		$this->options = array_merge(array(
			'class' => 'fade in',
		), $this->options);

143
		Html::addCssClass($this->options, 'alert');
Antonio Ramirez committed
144 145 146 147 148 149 150 151 152

		if ($this->closeButton !== null) {
			$this->closeButton = array_merge(array(
				'data-dismiss' => 'alert',
				'aria-hidden' => 'true',
				'class' => 'close',
			), $this->closeButton);
		}
	}
153
}