/** * {@inheritdoc} */ public function rebuild(array $definitions) { $links = array(); $children = array(); $top_links = array(); // Fetch the list of existing menus, in case some are not longer populated // after the rebuild. $before_menus = $this->getMenuNames(); if ($definitions) { foreach ($definitions as $id => $link) { // Flag this link as discovered, i.e. saved via rebuild(). $link['discovered'] = 1; // Note: The parent we set here might be just stored in the {menu_tree} // table, so it will not end up in $top_links. Therefore the later loop // on the orphan links, will handle those cases. if (!empty($link['parent'])) { $children[$link['parent']][$id] = $id; } else { // A top level link - we need them to root our tree. $top_links[$id] = $id; $link['parent'] = ''; } $links[$id] = $link; } } foreach ($top_links as $id) { $this->saveRecursive($id, $children, $links); } // Handle any children we didn't find starting from top-level links. foreach ($children as $orphan_links) { foreach ($orphan_links as $id) { // Check for a parent that is not loaded above since only internal links // are loaded above. $parent = $this->loadFull($links[$id]['parent']); // If there is a parent add it to the links to be used in // ::saveRecursive(). if ($parent) { $links[$links[$id]['parent']] = $parent; } else { // Force it to the top level. $links[$id]['parent'] = ''; } $this->saveRecursive($id, $children, $links); } } $result = $this->findNoLongerExistingLinks($definitions); // Remove all such items. if ($result) { $this->purgeMultiple($result); } $this->resetDefinitions(); $affected_menus = $this->getMenuNames() + $before_menus; // Invalidate any cache tagged with any menu name. $cache_tags = Cache::buildTags('config:system.menu', $affected_menus, '.'); $this->cacheTagsInvalidator->invalidateTags($cache_tags); $this->resetDefinitions(); // Every item in the cache bin should have one of the menu cache tags but it // is not guaranteed, so invalidate everything in the bin. $this->menuCacheBackend->invalidateAll(); }
/** * {@inheritdoc} */ public function rebuild(array $definitions) { $links = array(); $children = array(); $top_links = array(); // Fetch the list of existing menus, in case some are not longer populated // after the rebuild. $before_menus = $this->getMenuNames(); if ($definitions) { foreach ($definitions as $id => $link) { // Flag this link as discovered, i.e. saved via rebuild(). $link['discovered'] = 1; if (!empty($link['parent'])) { $children[$link['parent']][$id] = $id; } else { // A top level link - we need them to root our tree. $top_links[$id] = $id; $link['parent'] = ''; } $links[$id] = $link; } } foreach ($top_links as $id) { $this->saveRecursive($id, $children, $links); } // Handle any children we didn't find starting from top-level links. foreach ($children as $orphan_links) { foreach ($orphan_links as $id) { // Force it to the top level. $links[$id]['parent'] = ''; $this->saveRecursive($id, $children, $links); } } // Find any previously discovered menu links that no longer exist. if ($definitions) { $query = $this->connection->select($this->table, NULL, $this->options); $query->addField($this->table, 'id'); $query->condition('discovered', 1); $query->condition('id', array_keys($definitions), 'NOT IN'); // Starting from links with the greatest depth will minimize the amount // of re-parenting done by the menu storage. $query->orderBy('depth', 'DESC'); $result = $query->execute()->fetchCol(); } else { $result = array(); } // Remove all such items. if ($result) { $this->purgeMultiple($result); } $this->resetDefinitions(); $affected_menus = $this->getMenuNames() + $before_menus; // Invalidate any cache tagged with any menu name. $cache_tags = Cache::buildTags('menu', $affected_menus); Cache::invalidateTags($cache_tags); $this->resetDefinitions(); // Every item in the cache bin should have one of the menu cache tags but it // is not guaranteed, so invalidate everything in the bin. $this->menuCacheBackend->invalidateAll(); }
/** * {@inheritdoc} */ public function rebuild(array $definitions) { $links = array(); $children = array(); $top_links = array(); // Fetch the list of existing menus, in case some are not longer populated // after the rebuild. $before_menus = $this->getMenuNames(); if ($definitions) { foreach ($definitions as $id => $link) { // Flag this link as discovered, i.e. saved via rebuild(). $link['discovered'] = 1; if (!empty($link['parent'])) { $children[$link['parent']][$id] = $id; } else { // A top level link - we need them to root our tree. $top_links[$id] = $id; $link['parent'] = ''; } $links[$id] = $link; } } foreach ($top_links as $id) { $this->saveRecursive($id, $children, $links); } // Handle any children we didn't find starting from top-level links. foreach ($children as $orphan_links) { foreach ($orphan_links as $id) { // Force it to the top level. $links[$id]['parent'] = ''; $this->saveRecursive($id, $children, $links); } } $result = $this->findNoLongerExistingLinks($definitions); // Remove all such items. if ($result) { $this->purgeMultiple($result); } $this->resetDefinitions(); $affected_menus = $this->getMenuNames() + $before_menus; // Invalidate any cache tagged with any menu name. $cache_tags = Cache::buildTags('config:system.menu', $affected_menus, '.'); $this->cacheTagsInvalidator->invalidateTags($cache_tags); $this->resetDefinitions(); // Every item in the cache bin should have one of the menu cache tags but it // is not guaranteed, so invalidate everything in the bin. $this->menuCacheBackend->invalidateAll(); }
/** * {@inheritdoc} */ public function invalidateAll() { $this->markAsOutdated(); $this->consistentBackend->invalidateAll(); }
/** * {@inheritdoc} */ public function invalidateAll() { return $this->decorated->invalidateAll(); }
/** * {@inheritdoc} */ public function invalidateAll() { return $this->cacheBackend->invalidateAll(); }