<?php /** * TbCarousel class file. * @author Christoffer Niska <ChristofferNiska@gmail.com> * @copyright Copyright © Christoffer Niska 2011- * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @package bootstrap.widgets * @since 0.9.10 */ /** * Bootstrap carousel widget. * @see http://twitter.github.com/bootstrap/javascript.html#carousel */ class TbCarousel extends CWidget { /** * @var string the previous button label. Defaults to '‹'. */ public $prevLabel = '‹'; /** * @var string the next button label. Defaults to '›'. */ public $nextLabel = '›'; /** * @var boolean indicates whether the carousel should slide items. */ public $slide = true; /** * @var boolean indicates whether to display the previous and next links. */ public $displayPrevAndNext = true; /** * @var array the carousel items configuration. */ public $items = array(); /** * @var array the options for the Bootstrap Javascript plugin. */ public $options = array(); /** * @var string[] the Javascript event handlers. */ public $events = array(); /** * @var array the HTML attributes for the widget container. */ public $htmlOptions = array(); /** * Initializes the widget. */ public function init() { if (!isset($this->htmlOptions['id'])) $this->htmlOptions['id'] = $this->getId(); $classes = array('carousel'); if ($this->slide === true) $classes[] = 'slide'; if (!empty($classes)) { $classes = implode(' ', $classes); if (isset($this->htmlOptions['class'])) $this->htmlOptions['class'] .= ' '.$classes; else $this->htmlOptions['class'] = $classes; } } /** * Runs the widget. */ public function run() { $id = $this->htmlOptions['id']; echo CHtml::openTag('div', $this->htmlOptions); echo '<div class="carousel-inner">'; $this->renderItems($this->items); if ($this->displayPrevAndNext) { echo '</div>'; echo '<a class="carousel-control left" href="#'.$id.'" data-slide="prev">'.$this->prevLabel.'</a>'; echo '<a class="carousel-control right" href="#'.$id.'" data-slide="next">'.$this->nextLabel.'</a>'; echo '</div>'; } /** @var CClientScript $cs */ $cs = Yii::app()->getClientScript(); $options = !empty($this->options) ? CJavaScript::encode($this->options) : ''; $cs->registerScript(__CLASS__.'#'.$id, "jQuery('#{$id}').carousel({$options});"); foreach ($this->events as $name => $handler) { $handler = CJavaScript::encode($handler); $cs->registerScript(__CLASS__.'#'.$id.'_'.$name, "jQuery('#{$id}').on('{$name}', {$handler});"); } } /** * Renders the carousel items. * @param array $items the item configuration. */ protected function renderItems($items) { foreach ($items as $i => $item) { if (!is_array($item)) continue; if (isset($item['visible']) && $item['visible'] === false) continue; if (!isset($item['itemOptions'])) $item['itemOptions'] = array(); $classes = array('item'); if ($i === 0) $classes[] = 'active'; if (!empty($classes)) { $classes = implode(' ', $classes); if (isset($item['itemOptions']['class'])) $item['itemOptions']['class'] .= ' '.$classes; else $item['itemOptions']['class'] = $classes; } echo CHtml::openTag('div', $item['itemOptions']); if (isset($item['image'])) { if (!isset($item['alt'])) $item['alt'] = ''; if (!isset($item['imageOptions'])) $item['imageOptions'] = array(); echo CHtml::image($item['image'], $item['alt'], $item['imageOptions']); } if (!empty($item['caption']) && (isset($item['label']) || isset($item['caption']))) { if (!isset($item['captionOptions'])) $item['captionOptions'] = array(); if (isset($item['captionOptions']['class'])) $item['captionOptions']['class'] .= ' carousel-caption'; else $item['captionOptions']['class'] = 'carousel-caption'; echo CHtml::openTag('div', $item['captionOptions']); if (isset($item['label'])) echo '<h4>'.$item['label'].'</h4>'; if (isset($item['caption'])) echo '<p>'.$item['caption'].'</p>'; echo '</div>'; } echo '</div>'; } } }