/** * Tests that a link's stored representation matches the expected values. * * @param string $id * The ID of the menu link to test * @param array $expected_properties * A keyed array of column names and values like has_children and depth. * @param array $parents * An ordered array of the IDs of the menu links that are the parents. * @param array $children * Array of child IDs that are visible (enabled == 1). */ protected function assertMenuLink($id, array $expected_properties, array $parents = array(), array $children = array()) { $query = $this->connection->select('menu_tree'); $query->fields('menu_tree'); $query->condition('id', $id); foreach ($expected_properties as $field => $value) { $query->condition($field, $value); } $all = $query->execute()->fetchAll(\PDO::FETCH_ASSOC); $this->assertEqual(count($all), 1, "Found link {$id} matching all the expected properties"); $raw = reset($all); // Put the current link onto the front. array_unshift($parents, $raw['id']); $query = $this->connection->select('menu_tree'); $query->fields('menu_tree', array('id', 'mlid')); $query->condition('id', $parents, 'IN'); $found_parents = $query->execute()->fetchAllKeyed(0, 1); $this->assertEqual(count($parents), count($found_parents), 'Found expected number of parents'); $this->assertEqual($raw['depth'], count($found_parents), 'Number of parents is the same as the depth'); $materialized_path = $this->treeStorage->getRootPathIds($id); $this->assertEqual(array_values($materialized_path), array_values($parents), 'Parents match the materialized path'); // Check that the selected mlid values of the parents are in the correct // column, including the link's own. for ($i = $raw['depth']; $i >= 1; $i--) { $parent_id = array_shift($parents); $this->assertEqual($raw["p{$i}"], $found_parents[$parent_id], "mlid of parent matches at column p{$i}"); } for ($i = $raw['depth'] + 1; $i <= $this->treeStorage->maxDepth(); $i++) { $this->assertEqual($raw["p{$i}"], 0, "parent is 0 at column p{$i} greater than depth"); } if ($parents) { $this->assertEqual($raw['parent'], end($parents), 'Ensure that the parent field is set properly'); } $found_children = array_keys($this->treeStorage->loadAllChildren($id)); // We need both these checks since the 2nd will pass if there are extra // IDs loaded in $found_children. $this->assertEqual(count($children), count($found_children), "Found expected number of children for {$id}"); $this->assertEqual(array_intersect($children, $found_children), $children, 'Child IDs match'); }
/** * {@inheritdoc} */ protected function loadLinks($menu_name, MenuTreeParameters $parameters) { $links = parent::loadLinks($menu_name, $parameters); $map = []; // Collect all menu_link_content IDs from the links. foreach ($links as $i => $link) { if ($link['provider'] != 'menu_link_content') { continue; } $metadata = unserialize($link['metadata']); $map[$metadata['entity_id']] = $i; } // Load all menu_link_content entities and remove links for the those that // don't belong to the active workspace. $active_workspace_id = $this->workspaceManager->getActiveWorkspace()->id(); $entities = $this->entityTypeManager->getStorage('menu_link_content')->loadMultiple(array_keys($map)); foreach ($map as $entity_id => $link_id) { if (!isset($entities[$entity_id]) || $active_workspace_id != $entities[$entity_id]->workspace->target_id) { unset($links[$link_id]); } } return $links; }