示例#1
0
 /**
  * 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');
 }
示例#2
0
 /**
  * {@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;
 }