Progress.php 3.72 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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 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 68 69 70 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 137 138 139 140 141 142 143 144 145 146 147
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\bootstrap;

use yii\base\InvalidConfigException;
use yii\helpers\base\ArrayHelper;
use yii\helpers\Html;


/**
 * Progress renders a bootstrap progress bar component.
 *
 * For example,
 *
 * ```php
 * // default with label
 * echo Progress::widget(array(
 *     'percent' => 60,
 *     'label' => 'test',
 * ));
 *
 * // styled
 * echo Progress::widget(array(
 *     'percent' => 65,
 *     'barOptions' => array('class' => 'bar-danger')
 * ));
 *
 * // striped
 * echo Progress::widget(array(
 *     'percent' => 70,
 *     'barOptions' => array('class' => 'bar-warning'),
 *     'options' => array('class' => 'progress-striped')
 * ));
 *
 * // striped animated
 * echo Progress::widget(array(
 *     'percent' => 70,
 *     'barOptions' => array('class' => 'bar-success'),
 *     'options' => array('class' => 'active progress-striped')
 * ));
 *
 * // stacked and one with label
 * echo Progress::widget(array(
 *     'stacked' => array(
 *         array('percent' => 30, 'options' => array('class' => 'bar-danger')),
 *         array('label'=>'test', 'percent' => 30, 'options' => array('class' => 'bar-success')),
 *         array('percent' => 35, 'options' => array('class' => 'bar-warning'))
 *     )
 * ));
 * ```
 * @see http://twitter.github.io/bootstrap/components.html#progress
 * @author Antonio Ramirez <amigo.cobos@gmail.com>
 * @since 2.0
 */
class Progress extends Widget
{
	/**
	 * @var string the button label
	 */
	public $label;
	/**
	 * @var integer the amount of progress as a percentage.
	 */
	public $percent = 0;
	/**
	 * @var array the HTML attributes of the
	 */
	public $barOptions = array();
	/**
	 * @var array $stacked set to an array of progress bar values to display stacked progress bars
	 *
	 * ```php
	 *  'stacked'=>array(
	 *      array('percent'=>'30', 'options'=>array('class'=>'custom')),
	 *      array('percent'=>'30'),
	 *  )
	 * ```
	 */
	public $stacked = false;


	/**
	 * Initializes the widget.
	 * If you override this method, make sure you call the parent implementation first.
	 */
	public function init()
	{
		if ($this->label === null && $this->stacked == false) {
			throw new InvalidConfigException("The 'percent' option is required.");
		}
		parent::init();
		$this->addCssClass($this->options, 'progress');
		$this->getView()->registerAssetBundle(static::$responsive ? 'yii/bootstrap/responsive' : 'yii/bootstrap');
	}

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

	/**
	 * Generates a bar
	 * @param int $percent the percentage of the bar
	 * @param string $label, optional, the label to display at the bar
	 * @param array $options the HTML attributes of the bar
	 * @return string the rendering result.
	 */
	public function bar($percent, $label = '', $options = array())
	{
		$this->addCssClass($options, 'bar');
		$options['style'] = "width:{$percent}%";
		return Html::tag('div', $label, $options);
	}

	/**
	 * @return string the rendering result.
	 * @throws InvalidConfigException
	 */
	protected function renderProgress()
	{
		if ($this->stacked === false) {
			return $this->bar($this->percent, $this->label, $this->barOptions);
		}
		$bars = array();
		foreach ($this->stacked as $item) {
			$label = ArrayHelper::getValue($item, 'label', '');
			if (!isset($item['percent'])) {
				throw new InvalidConfigException("The 'percent' option is required.");
			}
			$options = ArrayHelper::getValue($item, 'options', array());

			$bars[] = $this->bar($item['percent'], $label, $options);
		}
		return implode("\n", $bars);
	}

}