EliteConf
 All Data Structures Namespaces Files Functions Variables Pages
Freshy2Menu.php
Go to the documentation of this file.
1 <?php
2 /*/////////////////////////////////////////////////////////////////////////
3 // This file is part of the
4 // _______ _ ______
5 // (_______) | | (_____ \
6 // _____ ____ _____ ___ | |__ _ _ ____) )
7 // | ___)/ ___)| ___ | /___)| _ \ | | | | / ____/
8 // | | | | | ____||___ || | | || |_| | | (_____
9 // |_| |_| |_____)(___/ |_| |_| \__ | |_______)
10 // (____/
11 // Yii theme
12 //
13 // Ported from the original Wordpress Freshy 2 theme:
14 // http://www.jide.fr/english/downloads/freshy2
15 //
16 // Licensed under the GPL, like the original theme
17 // Copyleft 2011 - Jacob 'jacmoe' Moen @ http://www.jacmoe.dk/
19 ?>
20 <?php
59 class Freshy2Menu extends CWidget
60 {
83  public $items=array();
91  public $itemTemplate;
95  public $encodeLabel=true;
100  public $activeCssClass='active';
106  public $activateItems=true;
112  public $activateParents=false;
117  public $hideEmptyItems=true;
121  public $htmlOptions=array();
125  public $submenuHtmlOptions=array();
134  public $linkLabelWrapper;
140  public $firstItemCssClass;
146  public $lastItemCssClass;
147 
153  public function init()
154  {
155  $this->htmlOptions['id']=$this->getId();
156  $route=$this->getController()->getRoute();
157  $this->items=$this->normalizeItems($this->items,$route,$hasActiveChild);
158  }
159 
163  public function run()
164  {
165  $this->renderMenu($this->items);
166  }
167 
173  protected function renderMenu($items)
174  {
175  if(count($items))
176  {
177  echo CHtml::openTag('ul');
178  $this->renderMenuRecursive($items);
179  echo CHtml::closeTag('ul');
180  }
181  }
182 
187  protected function renderMenuRecursive($items)
188  {
189  $count=0;
190  $n=count($items);
191  foreach($items as $item)
192  {
193  $count++;
194  $options=isset($item['itemOptions']) ? $item['itemOptions'] : array();
195  $class=array();
196  if($item['active'] && $this->activeCssClass!=''){
197  $class[]='current_page_item';
198  } else {
199  $class[]='page_item page-item-'.$count;
200  }
201  if($count===1 && $this->firstItemCssClass!='')
202  $class[]=$this->firstItemCssClass;
203  if($count===$n && $this->lastItemCssClass!='')
204  $class[]=$this->lastItemCssClass;
205  if($class!==array())
206  {
207  if(empty($options['class']))
208  $options['class']=implode(' ',$class);
209  else
210  $options['class'].=' '.implode(' ',$class);
211  }
212  echo CHtml::openTag('li', $options);
213 
214  if(isset($item['url']))
215  {
216  $label=$this->linkLabelWrapper===null ? $item['label'] : '<'.$this->linkLabelWrapper.'>'.$item['label'].'</'.$this->linkLabelWrapper.'>';
217  $menu=CHtml::link($label,$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
218  }
219  else
220  $menu=CHtml::tag('span',isset($item['linkOptions']) ? $item['linkOptions'] : array(), $item['label']);
221  if(isset($this->itemTemplate) || isset($item['template']))
222  {
223  $template=isset($item['template']) ? $item['template'] : $this->itemTemplate;
224  echo strtr($template,array('{menu}'=>$menu));
225  }
226  else
227  echo $menu;
228  if(isset($item['items']) && count($item['items']))
229  {
230  echo "\n".CHtml::openTag('ul',$this->submenuHtmlOptions)."\n";
231  $this->renderMenuRecursive($item['items']);
232  echo CHtml::closeTag('ul')."\n";
233  }
234  echo CHtml::closeTag('li')."\n";
235  }
236  }
237 
245  protected function normalizeItems($items,$route,&$active)
246  {
247  foreach($items as $i=>$item)
248  {
249  if(isset($item['visible']) && !$item['visible'])
250  {
251  unset($items[$i]);
252  continue;
253  }
254  if($this->encodeLabel)
255  $items[$i]['label']=CHtml::encode($item['label']);
256  $hasActiveChild=false;
257  if(isset($item['items']))
258  {
259  $items[$i]['items']=$this->normalizeItems($item['items'],$route,$hasActiveChild);
260  if(empty($items[$i]['items']) && $this->hideEmptyItems)
261  unset($items[$i]['items']);
262  }
263  if(!isset($item['active']))
264  {
265  if($this->activateParents && $hasActiveChild || $this->activateItems && $this->isItemActive($item,$route))
266  $active=$items[$i]['active']=true;
267  else
268  $items[$i]['active']=false;
269  }
270  else if($item['active'])
271  $active=true;
272  }
273  return array_values($items);
274  }
275 
284  protected function isItemActive($item,$route)
285  {
286  if(isset($item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))
287  {
288  if(count($item['url'])>1)
289  {
290  foreach(array_splice($item['url'],1) as $name=>$value)
291  {
292  if(!isset($_GET[$name]) || $_GET[$name]!=$value)
293  return false;
294  }
295  }
296  return true;
297  }
298  return false;
299  }
300 }