Merge branch '1-priority-system-for-display' into 'master'

Add support for menu ordering #1

Closes #1

See merge request jankstudio1/catalyst-2/menu-bundle!1
This commit is contained in:
Kendrick Chan 2020-04-03 02:57:59 +00:00
commit c8e7f7b469
2 changed files with 87 additions and 5 deletions

View file

@ -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;
} }
} }

View file

@ -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;
} }