162 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Catalyst\MenuBundle\Service;
 | |
| 
 | |
| use Symfony\Component\Routing\Exception\RouteNotFoundException;
 | |
| use Symfony\Component\Yaml\Parser as YamlParser;
 | |
| use Symfony\Component\Config\ConfigCache;
 | |
| use Symfony\Component\Config\Resource\FileResource;
 | |
| use Symfony\Component\Routing\RouterInterface;
 | |
| use Symfony\Contracts\Translation\TranslatorInterface;
 | |
| 
 | |
| use Catalyst\MenuBundle\Menu\Collection;
 | |
| use Catalyst\MenuBundle\Menu\Item;
 | |
| 
 | |
| 
 | |
| class Generator
 | |
| {
 | |
|     protected $index;
 | |
|     protected $menu;
 | |
| 
 | |
|     protected $menu_data;
 | |
|     protected $translator;
 | |
| 
 | |
|     public function __construct($menu_data, TranslatorInterface $trans)
 | |
|     {
 | |
|         $this->translator = $trans;
 | |
|         $this->index = new Collection();
 | |
|         $this->menu = new Collection();
 | |
|         $this->menu_data = $this->processConfigs($menu_data);
 | |
|     }
 | |
| 
 | |
|     public function getMenu($menu_key)
 | |
|     {
 | |
|         if (!isset($this->menu_data[$menu_key]))
 | |
|             return null;
 | |
| 
 | |
|         return $this->menu_data[$menu_key];
 | |
|     }
 | |
| 
 | |
|     public function setSelected($menu_key, $id)
 | |
|     {
 | |
|         if (!isset($this->menu_data[$menu_key]))
 | |
|             return false;
 | |
| 
 | |
|         $sel = $this->menu_data[$menu_key]['index']->get($id);
 | |
|         if ($sel != null)
 | |
|             $sel->setSelected();
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     protected function processConfigs($data)
 | |
|     {
 | |
|         $pdata = [];
 | |
| 
 | |
|         // TODO: cache this
 | |
| 
 | |
|         // error_log(print_r($data, true));
 | |
| 
 | |
|         // 1st layer are the groups and the parents
 | |
|         // NOTE: extension already merged and sorted the groups for us
 | |
|         foreach ($data as $group => $group_data)
 | |
|         {
 | |
|             // store orphans here in case their parents have not yet been defined
 | |
|             $orphans = [];
 | |
| 
 | |
|             // initialize group data
 | |
|             if (!isset($pdata[$group]))
 | |
|             {
 | |
|                 $pdata[$group] = [
 | |
|                     'menu' => new Collection(),
 | |
|                     'index' => new Collection(),
 | |
|                 ];
 | |
|             }
 | |
| 
 | |
|             $index = $pdata[$group]['index'];
 | |
|             $menu = $pdata[$group]['menu'];
 | |
| 
 | |
|             // 2nd layer is group data
 | |
|             foreach ($group_data as $mi_data)
 | |
|             {
 | |
|                 // check params
 | |
|                 if (!isset($mi_data['icon']))
 | |
|                     $mi_data['icon'] = null;
 | |
| 
 | |
|                 // instantiate
 | |
|                 $mi = $this->newItem($index, $mi_data['id'], $mi_data['label'], $mi_data['icon']);
 | |
| 
 | |
|                 // acl
 | |
|                 if (isset($mi_data['acl']))
 | |
|                     $mi->setACLKey($mi_data['acl']);
 | |
| 
 | |
|                 // check for orphans
 | |
|                 if (isset($orphans[$mi_data['id']]))
 | |
|                 {
 | |
|                     foreach ($orphans[$mi_data['id']] as $orphan)
 | |
|                     {
 | |
|                         $mi->addChild($orphan);
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // check parent
 | |
|                 if (isset($mi_data['parent']) && $mi_data['parent'] != null)
 | |
|                 {
 | |
|                     $parent = $index->get($mi_data['parent']);
 | |
| 
 | |
|                     // if parent has not been set, add to orphans
 | |
|                     if ($parent == null)
 | |
|                     {
 | |
|                         if (!isset($orphans[$mi_data['parent']]))
 | |
|                             $orphans[$mi_data['parent']] = [];
 | |
| 
 | |
|                         $orphans[$mi_data['parent']][] = $mi;
 | |
|                         continue;
 | |
|                     }
 | |
| 
 | |
|                     $parent->addChild($mi);
 | |
|                 }
 | |
|                 else
 | |
|                     $menu->add($mi);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // error_log(print_r($pdata, true));
 | |
| 
 | |
|         return $pdata;
 | |
|     }
 | |
| 
 | |
|     protected function translate($text)
 | |
|     {
 | |
|         // find text enclosed in []
 | |
| 		$regex = '/\[(.*)\]/U';
 | |
| 		preg_match_all($regex, $text, $matches);
 | |
| 
 | |
|         // replace text enclodes in [] with the trnaslation of it
 | |
|         $final_text = $text;
 | |
|         $all_terms = $matches[1];
 | |
|         foreach ($all_terms as $term)
 | |
|         {
 | |
|             $trans_term = ucwords($this->translator->trans($term));
 | |
| 
 | |
|             $final_text = str_replace('[' . $term . ']', $trans_term, $final_text);
 | |
|         }
 | |
| 
 | |
|         return $final_text;
 | |
|     }
 | |
| 
 | |
|     protected function newItem($index, $id, $label, $icon = null)
 | |
|     {
 | |
|         $mi = new Item();
 | |
|         $mi->setID($id)
 | |
|             ->setLabel($this->translate($label))
 | |
|             ->setRoute($id);
 | |
| 
 | |
|         if ($icon != null)
 | |
|             $mi->setIcon($icon);
 | |
| 
 | |
|         $index->add($mi);
 | |
| 
 | |
|         return $mi;
 | |
|     }
 | |
| }
 |