In https://github.com/SnowdogApps/magento2-menu/blob/master/Block/Menu.php, a plugin that makes it possible to replace the default menu, the constructor of the block looks like below.
For all arguments / parameters in the constructor except array $data, my understanding is that those are somehow managed through the object manager and created if not existing. However, I'm stuck at figuring out how the array $data is set. In https://github.com/SnowdogApps/magento2-menu/blob/master/etc/di.xml, there is no argument named data.
Menu.php constructor:
public function __construct( Template\Context $context, EventManager $eventManager, MenuRepositoryInterface $menuRepository, NodeRepositoryInterface $nodeRepository, NodeTypeProvider $nodeTypeProvider, SearchCriteriaFactory $searchCriteriaFactory, FilterGroupBuilder $filterGroupBuilder, array $data = [] ) { parent::__construct($context, $data); $this->menuRepository = $menuRepository; $this->nodeRepository = $nodeRepository; $this->nodeTypeProvider = $nodeTypeProvider; $this->searchCriteriaFactory = $searchCriteriaFactory; $this->filterGroupBuilder = $filterGroupBuilder; $this->eventManager = $eventManager; } I've looked on this related question (Magento 2: what is the $data array constructor parameter?) and went to myMagentoRootFolder/vendor/magento/framework/DataObject.php, to have a look on the class which is inherited and uses the $data-parameter, this didn't make me understand it. Furthermore, I don't that the default empty array would work, because the getData()-method is used by the module and an empty response would be of no use.
DataObject.php constructor:
/** * Constructor * * By default is looking for first argument as array and assigns it as object attributes * This behavior may change in child classes * * @param array $data */ public function __construct(array $data = []) { $this->_data = $data; } *Menu.php extends Template, and Template extends AbstractBlock, and AbstractBlock extends DataObject
So, I don't understand how and where array $data is set. Any help is appreciated, as I've been struggling to understand this for some days.
<referenceContainer name="store.menu"> <block name="main.menu" class="Snowdog\Menu\Block\Menu" template="Snowdog_Menu::menu.phtml"> <arguments> <argument name="menu" xsi:type="string">main</argument> </arguments> </block> </referenceContainer>