1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
/**
* Admin system config startup page
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Config\Model\Config\Source\Admin;
/**
* @api
* @since 100.0.2
*/
class Page implements \Magento\Framework\Option\ArrayInterface
{
/**
* Menu model
*
* @var \Magento\Backend\Model\Menu
*/
protected $_menu;
/**
* @var \Magento\Backend\Model\Menu\Filter\IteratorFactory
*/
protected $_iteratorFactory;
/**
* @param \Magento\Backend\Model\Menu\Filter\IteratorFactory $iteratorFactory
* @param \Magento\Backend\Model\Menu\Config $menuConfig
*/
public function __construct(
\Magento\Backend\Model\Menu\Filter\IteratorFactory $iteratorFactory,
\Magento\Backend\Model\Menu\Config $menuConfig
) {
$this->_menu = $menuConfig->getMenu();
$this->_iteratorFactory = $iteratorFactory;
}
/**
* @return array
*/
public function toOptionArray()
{
$options = [];
$this->_createOptions($options, $this->_menu);
return $options;
}
/**
* Get menu filter iterator
*
* @param \Magento\Backend\Model\Menu $menu menu model
* @return \Magento\Backend\Model\Menu\Filter\Iterator
*/
protected function _getMenuIterator(\Magento\Backend\Model\Menu $menu)
{
return $this->_iteratorFactory->create(['iterator' => $menu->getIterator()]);
}
/**
* Create options array
*
* @param array &$optionArray
* @param \Magento\Backend\Model\Menu $menu
* @param int $level
* @return void
*/
protected function _createOptions(&$optionArray, \Magento\Backend\Model\Menu $menu, $level = 0)
{
$nonEscapableNbspChar = html_entity_decode(' ', ENT_NOQUOTES, 'UTF-8');
$paddingString = str_repeat($nonEscapableNbspChar, $level * 4);
foreach ($this->_getMenuIterator($menu) as $menuItem) {
/**@var $menuItem \Magento\Backend\Model\Menu\Item */
if ($menuItem->getAction()) {
$optionArray[] = [
'label' => $paddingString . $menuItem->getTitle(),
'value' => $menuItem->getId(),
];
if ($menuItem->hasChildren()) {
$this->_createOptions($optionArray, $menuItem->getChildren(), $level + 1);
}
} else {
$children = [];
if ($menuItem->hasChildren()) {
$this->_createOptions($children, $menuItem->getChildren(), $level + 1);
}
$optionArray[] = ['label' => $paddingString . $menuItem->getTitle(), 'value' => $children];
}
}
}
}