summaryrefslogtreecommitdiff
path: root/framework/web/widgets/CTabView.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/widgets/CTabView.php')
-rw-r--r--framework/web/widgets/CTabView.php212
1 files changed, 212 insertions, 0 deletions
diff --git a/framework/web/widgets/CTabView.php b/framework/web/widgets/CTabView.php
new file mode 100644
index 0000000..89b3e03
--- /dev/null
+++ b/framework/web/widgets/CTabView.php
@@ -0,0 +1,212 @@
+<?php
+/**
+ * CTabView class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+/**
+ * CTabView displays contents in multiple tabs.
+ *
+ * At any time, only one tab is visible. Users can click on the tab header
+ * to switch to see another tab of content.
+ *
+ * JavaScript is used to control the tab switching. If JavaScript is disabled,
+ * CTabView still manages to display the content in a semantically appropriate way.
+ *
+ * To specify contents and their tab structure, configure the {@link tabs} property.
+ * The {@link tabs} property takes an array with tab ID being mapped tab definition.
+ * Each tab definition is an array of the following structure:
+ * <ul>
+ * <li>title: the tab title.</li>
+ * <li>content: the content to be displayed in the tab.</li>
+ * <li>view: the name of the view to be displayed in this tab.
+ * The view will be rendered using the current controller's
+ * {@link CController::renderPartial} method.
+ * When both 'content' and 'view' are specified, 'content' will take precedence.
+ * </li>
+ * <li>url: a URL that the user browser will be redirected to when clicking on this tab.</li>
+ * <li>data: array (name=>value), this will be passed to the view when 'view' is specified.</li>
+ * </ul>
+ *
+ * For example, the {@link tabs} property can be configured as follows,
+ * <pre>
+ * array(
+ * 'tab1'=>array(
+ * 'title'=>'tab 1 title',
+ * 'view'=>'view1',
+ * 'data'=>array('model'=>$model),
+ * ),
+ * 'tab2'=>array(
+ * 'title'=>'tab 2 title',
+ * 'url'=>'http://www.yiiframework.com/',
+ * ),
+ * )
+ * </pre>
+ *
+ * By default, the first tab will be activated. To activate a different tab
+ * when the page is initially loaded, set {@link activeTab} to be the ID of the desired tab.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: CTabView.php 3515 2011-12-28 12:29:24Z mdomba $
+ * @package system.web.widgets
+ * @since 1.0
+ */
+class CTabView extends CWidget
+{
+ /**
+ * Default CSS class for the tab container
+ */
+ const CSS_CLASS='yiiTab';
+
+ /**
+ * @var mixed the CSS file used for the widget. Defaults to null, meaning
+ * using the default CSS file included together with the widget.
+ * If false, no CSS file will be used. Otherwise, the specified CSS file
+ * will be included when using this widget.
+ */
+ public $cssFile;
+ /**
+ * @var string the ID of the tab that should be activated when the page is initially loaded.
+ * If not set, the first tab will be activated.
+ */
+ public $activeTab;
+ /**
+ * @var array the data that will be passed to the partial view rendered by each tab.
+ */
+ public $viewData;
+ /**
+ * @var array additional HTML options to be rendered in the container tag.
+ */
+ public $htmlOptions;
+ /**
+ * @var array tab definitions. The array keys are the IDs,
+ * and the array values are the corresponding tab contents.
+ * Each array value must be an array with the following elements:
+ * <ul>
+ * <li>title: the tab title. You need to make sure this is HTML-encoded.</li>
+ * <li>content: the content to be displayed in the tab.</li>
+ * <li>view: the name of the view to be displayed in this tab.
+ * The view will be rendered using the current controller's
+ * {@link CController::renderPartial} method.
+ * When both 'content' and 'view' are specified, 'content' will take precedence.
+ * </li>
+ * <li>url: a URL that the user browser will be redirected to when clicking on this tab.</li>
+ * <li>data: array (name=>value), this will be passed to the view when 'view' is specified.
+ * This option is available since version 1.1.1.</li>
+ * </ul>
+ * <pre>
+ * array(
+ * 'tab1'=>array(
+ * 'title'=>'tab 1 title',
+ * 'view'=>'view1',
+ * ),
+ * 'tab2'=>array(
+ * 'title'=>'tab 2 title',
+ * 'url'=>'http://www.yiiframework.com/',
+ * ),
+ * )
+ * </pre>
+ */
+ public $tabs=array();
+
+ /**
+ * Runs the widget.
+ */
+ public function run()
+ {
+ if(empty($this->tabs))
+ return;
+
+ if($this->activeTab===null || !isset($this->tabs[$this->activeTab]))
+ {
+ reset($this->tabs);
+ list($this->activeTab, )=each($this->tabs);
+ }
+
+ $htmlOptions=$this->htmlOptions;
+ $htmlOptions['id']=$this->getId();
+ if(!isset($htmlOptions['class']))
+ $htmlOptions['class']=self::CSS_CLASS;
+
+ $this->registerClientScript();
+
+ echo CHtml::openTag('div',$htmlOptions)."\n";
+ $this->renderHeader();
+ $this->renderBody();
+ echo CHtml::closeTag('div');
+ }
+
+ /**
+ * Registers the needed CSS and JavaScript.
+ */
+ public function registerClientScript()
+ {
+ $cs=Yii::app()->getClientScript();
+ $cs->registerCoreScript('yiitab');
+ $id=$this->getId();
+ $cs->registerScript('Yii.CTabView#'.$id,"jQuery(\"#{$id}\").yiitab();");
+
+ if($this->cssFile!==false)
+ self::registerCssFile($this->cssFile);
+ }
+
+ /**
+ * Registers the needed CSS file.
+ * @param string $url the CSS URL. If null, a default CSS URL will be used.
+ */
+ public static function registerCssFile($url=null)
+ {
+ $cs=Yii::app()->getClientScript();
+ if($url===null)
+ $url=$cs->getCoreScriptUrl().'/yiitab/jquery.yiitab.css';
+ $cs->registerCssFile($url,'screen');
+ }
+
+ /**
+ * Renders the header part.
+ */
+ protected function renderHeader()
+ {
+ echo "<ul class=\"tabs\">\n";
+ foreach($this->tabs as $id=>$tab)
+ {
+ $title=isset($tab['title'])?$tab['title']:'undefined';
+ $active=$id===$this->activeTab?' class="active"' : '';
+ $url=isset($tab['url'])?$tab['url']:"#{$id}";
+ echo "<li><a href=\"{$url}\"{$active}>{$title}</a></li>\n";
+ }
+ echo "</ul>\n";
+ }
+
+ /**
+ * Renders the body part.
+ */
+ protected function renderBody()
+ {
+ foreach($this->tabs as $id=>$tab)
+ {
+ $inactive=$id!==$this->activeTab?' style="display:none"' : '';
+ echo "<div class=\"view\" id=\"{$id}\"{$inactive}>\n";
+ if(isset($tab['content']))
+ echo $tab['content'];
+ else if(isset($tab['view']))
+ {
+ if(isset($tab['data']))
+ {
+ if(is_array($this->viewData))
+ $data=array_merge($this->viewData, $tab['data']);
+ else
+ $data=$tab['data'];
+ }
+ else
+ $data=$this->viewData;
+ $this->getController()->renderPartial($tab['view'], $data);
+ }
+ echo "</div><!-- {$id} -->\n";
+ }
+ }
+}