EliteConf
 All Data Structures Namespaces Files Functions Variables Pages
ArtMenu.php
Go to the documentation of this file.
1 <?php
43 class ArtMenu extends CWidget
44 {
70  public $items=array();
78  public $itemTemplate;
82  public $encodeLabel=true;
87  public $activeCssClass='active';
93  public $activateItems=true;
99  public $activateParents=false;
104  public $hideEmptyItems=true;
108  public $htmlOptions=array();
112  public $submenuHtmlOptions=array();
121  // public $linkLabelWrapper;
134 
143  public $cls;
144 
151 
158 
164  public function init()
165  {
166  if (isset($this->cls))
167  {
168  $this->htmlOptions['class']=$this->cls;
169  }
170  $route=$this->getController()->getRoute();
171  $this->items=$this->normalizeItems($this->items,$route,$hasActiveChild);
172  }
173 
177  public function run()
178  {
179  $this->renderMenu($this->items);
180  }
181 
187  protected function renderMenu($items)
188  {
189  if(count($items))
190  {
191  echo CHtml::openTag('ul',$this->htmlOptions)."\n";
192  $this->renderMenuRecursive($items);
193  echo CHtml::closeTag('ul');
194  }
195  }
196 
201  protected function renderMenuRecursive($items)
202  {
203  $count=0;
204  $n=count($items);
205  foreach($items as $item)
206  {
207  $count++;
208  $options=isset($item['itemOptions']) ? $item['itemOptions'] : array();
209  $class=array();
210  if($item['active'] && $this->activeCssClass!='')
211  $class[]=$this->activeCssClass;
212  if($count===1 && $this->firstItemCssClass!='')
213  $class[]=$this->firstItemCssClass;
214  if($count===$n && $this->lastItemCssClass!='')
215  $class[]=$this->lastItemCssClass;
216  if($class!==array())
217  {
218  if(empty($options['class']))
219  $options['class']=implode(' ',$class);
220  else
221  $options['class'].=' '.implode(' ',$class);
222  }
223 
224  echo CHtml::openTag('li', $options);
225 
226  $menu=$this->renderMenuItem($item);
227  if(isset($this->itemTemplate) || isset($item['template']))
228  {
229  $template=isset($item['template']) ? $item['template'] : $this->itemTemplate;
230  echo strtr($template,array('{menu}'=>$menu));
231  }
232  else
233  echo $menu;
234 
235  if(isset($item['items']) && count($item['items']))
236  {
237  echo "\n".CHtml::openTag('ul',isset($item['submenuOptions']) ? $item['submenuOptions'] : $this->submenuHtmlOptions)."\n";
238  $this->renderMenuRecursive($item['items']);
239  echo CHtml::closeTag('ul')."\n";
240  }
241 
242  echo CHtml::closeTag('li')."\n";
243  }
244  }
245 
253  protected function renderMenuItem($item)
254  {
255  if(isset($item['url']))
256  {
257  // customization added by B. Lee 4/17/2011
258  //$label='<span class="l"></span><span class="r"></span><span class="t">'.$item['label'].'</span>';
259 
260  $label=$this->prelinklabel.$item['label'].$this->postlinklabel;
261  if ($item['active'])
262  {
263  $item['linkOptions']=array('class' => 'active');
264  } // end of customization
265 
266  return CHtml::link($label,$item['url'],isset($item['linkOptions']) ? $item['linkOptions'] : array());
267  }
268  else
269  return CHtml::tag('span',isset($item['linkOptions']) ? $item['linkOptions'] : array(), $item['label']);
270  }
271 
279  protected function normalizeItems($items,$route,&$active)
280  {
281  foreach($items as $i=>$item)
282  {
283  if(isset($item['visible']) && !$item['visible'])
284  {
285  unset($items[$i]);
286  continue;
287  }
288  if(!isset($item['label']))
289  $item['label']='';
290  if($this->encodeLabel)
291  $items[$i]['label']=CHtml::encode($item['label']);
292  $hasActiveChild=false;
293  if(isset($item['items']))
294  {
295  $items[$i]['items']=$this->normalizeItems($item['items'],$route,$hasActiveChild);
296  if(empty($items[$i]['items']) && $this->hideEmptyItems)
297  unset($items[$i]['items']);
298  }
299  if(!isset($item['active']))
300  {
301  if($this->activateParents && $hasActiveChild || $this->activateItems && $this->isItemActive($item,$route))
302  $active=$items[$i]['active']=true;
303  else
304  $items[$i]['active']=false;
305  }
306  else if($item['active'])
307  $active=true;
308  }
309  return array_values($items);
310  }
311 
320  protected function isItemActive($item,$route)
321  {
322  if(isset($item['url']) && is_array($item['url']) && !strcasecmp(trim($item['url'][0],'/'),$route))
323  {
324  if(count($item['url'])>1)
325  {
326  foreach(array_splice($item['url'],1) as $name=>$value)
327  {
328  if(!isset($_GET[$name]) || $_GET[$name]!=$value)
329  return false;
330  }
331  }
332  return true;
333  }
334  return false;
335  }
336 }