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\Config\FileLocator;
|
||||
|
||||
use Catalyst\MenuBundle\Menu\Collection;
|
||||
use Catalyst\MenuBundle\Menu\Item;
|
||||
|
||||
|
||||
class CatalystMenuExtension extends Extension
|
||||
{
|
||||
const ORDER_DEFAULT = 100;
|
||||
|
||||
public function load(array $configs, ContainerBuilder $container)
|
||||
{
|
||||
$loader = new YamlFileLoader(
|
||||
|
|
@ -21,10 +27,57 @@ class CatalystMenuExtension extends Extension
|
|||
// will break across multiple configuration files.
|
||||
// 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
|
||||
$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 = [];
|
||||
|
||||
error_log(print_r($data, true));
|
||||
// TODO: cache this
|
||||
|
||||
// error_log(print_r($data, true));
|
||||
|
||||
/*
|
||||
// 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)
|
||||
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]))
|
||||
{
|
||||
|
|
@ -73,12 +80,32 @@ class Generator
|
|||
if (isset($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
|
||||
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']] = [];
|
||||
|
||||
error_log('found orphan - ' . $mi_data['parent']);
|
||||
|
||||
$orphans[$mi_data['parent']][] = $mi;
|
||||
continue;
|
||||
}
|
||||
|
||||
$parent->addChild($mi);
|
||||
}
|
||||
|
|
@ -86,9 +113,11 @@ class Generator
|
|||
$menu->add($mi);
|
||||
}
|
||||
}
|
||||
/*
|
||||
}
|
||||
*/
|
||||
|
||||
error_log(print_r($pdata, true));
|
||||
// error_log(print_r($pdata, true));
|
||||
|
||||
return $pdata;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue