Add support for menu ordering #1
This commit is contained in:
		
							parent
							
								
									6bead2fc57
								
							
						
					
					
						commit
						63df2750c3
					
				
					 2 changed files with 87 additions and 5 deletions
				
			
		|  | @ -7,8 +7,14 @@ use Symfony\Component\DependencyInjection\Extension\Extension; | ||||||
| use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | ||||||
| use Symfony\Component\Config\FileLocator; | use Symfony\Component\Config\FileLocator; | ||||||
| 
 | 
 | ||||||
|  | use Catalyst\MenuBundle\Menu\Collection; | ||||||
|  | use Catalyst\MenuBundle\Menu\Item; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class CatalystMenuExtension extends Extension | class CatalystMenuExtension extends Extension | ||||||
| { | { | ||||||
|  |     const ORDER_DEFAULT     = 100; | ||||||
|  | 
 | ||||||
|     public function load(array $configs, ContainerBuilder $container) |     public function load(array $configs, ContainerBuilder $container) | ||||||
|     { |     { | ||||||
|         $loader = new YamlFileLoader( |         $loader = new YamlFileLoader( | ||||||
|  | @ -21,10 +27,57 @@ class CatalystMenuExtension extends Extension | ||||||
|         //       will break across multiple configuration files.
 |         //       will break across multiple configuration files.
 | ||||||
|         //       Issue can be found here: https://github.com/symfony/symfony/issues/29817
 |         //       Issue can be found here: https://github.com/symfony/symfony/issues/29817
 | ||||||
| 
 | 
 | ||||||
| 		// $data = $this->processConfigs($configs);
 | 		$data = $this->processConfigs($configs); | ||||||
| 
 | 
 | ||||||
|         // set acl data for main acl generator
 |         // set acl data for main acl generator
 | ||||||
|         $def = $container->getDefinition('catalyst_menu.generator'); |         $def = $container->getDefinition('catalyst_menu.generator'); | ||||||
|         $def->replaceArgument('$menu_data', $configs); |         // $def->replaceArgument('$menu_data', $configs);
 | ||||||
|  |         $def->replaceArgument('$menu_data', $data); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function processConfigs($data) | ||||||
|  |     { | ||||||
|  |         $pdata = []; | ||||||
|  | 
 | ||||||
|  |         // error_log(print_r($data, true));
 | ||||||
|  | 
 | ||||||
|  |         // manual array merge
 | ||||||
|  |         // first layer contains all the instances in config
 | ||||||
|  |         foreach ($data as $instance_data) | ||||||
|  |         { | ||||||
|  |             // 2nd layer are the groups and the parents
 | ||||||
|  |             foreach ($instance_data as $group => $group_data) | ||||||
|  |             { | ||||||
|  | 				// initialize group data
 | ||||||
|  |                 if (!isset($pdata[$group])) | ||||||
|  |                     $pdata[$group] = $group_data; | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     // append to group data
 | ||||||
|  |                     foreach ($group_data as $menu_data) | ||||||
|  |                         $pdata[$group][] = $menu_data; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // sort group data according to display priority
 | ||||||
|  |         foreach ($pdata as $group => $group_data) | ||||||
|  |         { | ||||||
|  |             usort($pdata[$group], function($a, $b) { | ||||||
|  |                 if (isset($a['order'])) | ||||||
|  |                     $a_order = $a['order']; | ||||||
|  |                 else | ||||||
|  |                     $a_order = self::ORDER_DEFAULT; | ||||||
|  | 
 | ||||||
|  |                 if (isset($b['order'])) | ||||||
|  |                     $b_order = $b['order']; | ||||||
|  |                 else | ||||||
|  |                     $b_order = self::ORDER_DEFAULT; | ||||||
|  | 
 | ||||||
|  |                 return $a_order - $b_order; | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $pdata; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -40,14 +40,21 @@ class Generator | ||||||
|     { |     { | ||||||
|         $pdata = []; |         $pdata = []; | ||||||
| 
 | 
 | ||||||
|         error_log(print_r($data, true)); |         // TODO: cache this
 | ||||||
| 
 | 
 | ||||||
|  |         // error_log(print_r($data, true));
 | ||||||
|  | 
 | ||||||
|  |         /* | ||||||
|         // first layer contains all the instances in config
 |         // first layer contains all the instances in config
 | ||||||
|         foreach ($data as $instance_data) |         foreach ($data as $instance_data) | ||||||
|         { |         { | ||||||
|  |         */ | ||||||
|             // 2nd layer are the groups and the parents
 |             // 2nd layer are the groups and the parents
 | ||||||
|             foreach ($instance_data as $group => $group_data) |             foreach ($data as $group => $group_data) | ||||||
|             { |             { | ||||||
|  |                 // store orphans here in case their parents have not yet been defined
 | ||||||
|  |                 $orphans = []; | ||||||
|  | 
 | ||||||
| 				// initialize group data
 | 				// initialize group data
 | ||||||
|                 if (!isset($pdata[$group])) |                 if (!isset($pdata[$group])) | ||||||
| 				{ | 				{ | ||||||
|  | @ -73,12 +80,32 @@ class Generator | ||||||
|                     if (isset($mi_data['acl'])) |                     if (isset($mi_data['acl'])) | ||||||
|                         $mi->setACLKey($mi_data['acl']); |                         $mi->setACLKey($mi_data['acl']); | ||||||
| 
 | 
 | ||||||
|  |                     // check for orphans
 | ||||||
|  |                     if (isset($orphans[$mi_data['id']])) | ||||||
|  |                     { | ||||||
|  |                         error_log('orphan for - ' . $mi_data['id']); | ||||||
|  |                         foreach ($orphans[$mi_data['id']] as $orphan) | ||||||
|  |                         { | ||||||
|  |                             $mi->addChild($orphan); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|                     // check parent
 |                     // check parent
 | ||||||
|                     if (isset($mi_data['parent']) && $mi_data['parent'] != null) |                     if (isset($mi_data['parent']) && $mi_data['parent'] != null) | ||||||
|                     { |                     { | ||||||
|                         $parent = $index->get($mi_data['parent']); |                         $parent = $index->get($mi_data['parent']); | ||||||
|  | 
 | ||||||
|  |                         // if parent has not been set, add to orphans
 | ||||||
|                         if ($parent == null) |                         if ($parent == null) | ||||||
|  |                         { | ||||||
|  |                             if (!isset($orphans[$mi_data['parent']])) | ||||||
|  |                                 $orphans[$mi_data['parent']] = []; | ||||||
|  | 
 | ||||||
|  |                             error_log('found orphan - ' . $mi_data['parent']); | ||||||
|  | 
 | ||||||
|  |                             $orphans[$mi_data['parent']][] = $mi; | ||||||
|                             continue; |                             continue; | ||||||
|  |                         } | ||||||
| 
 | 
 | ||||||
|                         $parent->addChild($mi); |                         $parent->addChild($mi); | ||||||
|                     } |                     } | ||||||
|  | @ -86,9 +113,11 @@ class Generator | ||||||
|                         $menu->add($mi); |                         $menu->add($mi); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |         /* | ||||||
|         } |         } | ||||||
|  |         */ | ||||||
| 
 | 
 | ||||||
|         error_log(print_r($pdata, true)); |         // error_log(print_r($pdata, true));
 | ||||||
| 
 | 
 | ||||||
|         return $pdata; |         return $pdata; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue