1 <?php
2 3 4 5 6 7 8
9
10 Yii::import('bootstrap.widgets.TbMenu');
11
12 13 14 15
16 class TbTabs extends CWidget
17 {
18
19 const PLACEMENT_ABOVE = 'above';
20 const PLACEMENT_BELOW = 'below';
21 const PLACEMENT_LEFT = 'left';
22 const PLACEMENT_RIGHT = 'right';
23
24 25 26 27 28
29 public $type = TbMenu::TYPE_TABS;
30 31 32 33
34 public $placement;
35 36 37
38 public $tabs = array();
39 40 41
42 public $encodeLabel = true;
43 44 45
46 public $events = array();
47 48 49
50 public $htmlOptions = array();
51
52 53 54
55 public function init()
56 {
57 if (!isset($this->htmlOptions['id']))
58 $this->htmlOptions['id'] = $this->getId();
59
60 $classes = array();
61
62 $validPlacements = array(self::PLACEMENT_ABOVE, self::PLACEMENT_BELOW, self::PLACEMENT_LEFT, self::PLACEMENT_RIGHT);
63
64 if (isset($this->placement) && in_array($this->placement, $validPlacements))
65 $classes[] = 'tabs-'.$this->placement;
66
67 if (!empty($classes))
68 {
69 $classes = implode(' ', $classes);
70 if (isset($this->htmlOptions['class']))
71 $this->htmlOptions['class'] .= ' '.$classes;
72 else
73 $this->htmlOptions['class'] = $classes;
74 }
75 }
76
77 78 79
80 public function run()
81 {
82 $id = $this->id;
83 $content = array();
84 $items = $this->normalizeTabs($this->tabs, $content);
85
86 ob_start();
87 $this->controller->widget('bootstrap.widgets.TbMenu', array(
88 'type'=>$this->type,
89 'encodeLabel'=>$this->encodeLabel,
90 'items'=>$items,
91 ));
92 $tabs = ob_get_clean();
93
94 ob_start();
95 echo '<div class="tab-content">';
96 echo implode('', $content);
97 echo '</div>';
98 $content = ob_get_clean();
99
100 echo CHtml::openTag('div', $this->htmlOptions);
101 echo $this->placement === self::PLACEMENT_BELOW ? $content.$tabs : $tabs.$content;
102 echo '</div>';
103
104
105 $cs = Yii::app()->getClientScript();
106 $cs->registerScript(__CLASS__.'#'.$id, "jQuery('#{$id}').tab('show');");
107
108 foreach ($this->events as $name => $handler)
109 {
110 $handler = CJavaScript::encode($handler);
111 $cs->registerScript(__CLASS__.'#'.$id.'_'.$name, "jQuery('#{$id}').on('{$name}', {$handler});");
112 }
113 }
114
115 116 117 118 119 120 121
122 protected function normalizeTabs($tabs, &$panes, &$i = 0)
123 {
124 $id = $this->getId();
125 $items = array();
126
127 foreach ($tabs as $tab)
128 {
129 $item = $tab;
130
131 if (isset($item['visible']) && $item['visible'] === false)
132 continue;
133
134 if (!isset($item['itemOptions']))
135 $item['itemOptions'] = array();
136
137 $item['linkOptions']['data-toggle'] = 'tab';
138
139 if (isset($tab['items']))
140 $item['items'] = $this->normalizeTabs($item['items'], $panes, $i);
141 else
142 {
143 if (!isset($item['id']))
144 $item['id'] = $id.'_tab_'.($i + 1);
145
146 $item['url'] = '#'.$item['id'];
147
148 if (!isset($item['content']))
149 $item['content'] = '';
150
151 $content = $item['content'];
152 unset($item['content']);
153
154 if (!isset($item['paneOptions']))
155 $item['paneOptions'] = array();
156
157 $paneOptions = $item['paneOptions'];
158 unset($item['paneOptions']);
159
160 $paneOptions['id'] = $item['id'];
161
162 $classes = array('tab-pane fade');
163
164 if (isset($item['active']) && $item['active'])
165 $classes[] = 'active in';
166
167 $classes = implode(' ', $classes);
168 if (isset($paneOptions['class']))
169 $paneOptions['class'] .= ' '.$classes;
170 else
171 $paneOptions['class'] = $classes;
172
173 $panes[] = CHtml::tag('div', $paneOptions, $content);
174
175 $i++;
176 }
177
178 $items[] = $item;
179 }
180
181 return $items;
182 }
183 }
184