Special root entry entry will have parentId=0 and text=''.
In standard installation this entry will point to location with id=2.
abstract public isRootEntry ( mixed $id ) : boolean | ||
$id | mixed | |
return | boolean |
/** * Returns boolean indicating if the row with given $id is special root entry. * * Special root entry entry will have parentId=0 and text=''. * In standard installation this entry will point to location with id=2. * * @param mixed $id * * @return bool */ public function isRootEntry($id) { try { return $this->innerGateway->isRootEntry($id); } catch (DBALException $e) { throw new \RuntimeException('Database error', 0, $e); } catch (PDOException $e) { throw new \RuntimeException('Database error', 0, $e); } }
/** * Returns possibly corrected alias id for given $locationId. * * First level entries must have parent id set to 0 instead of their parent location alias id. * There are two cases when alias id needs to be corrected: * 1) location is special location without URL alias (location with id=1 in standard installation) * 2) location is site root location, having special root entry in the ezurlalias_ml table (location with id=2 * in standard installation) * * @param mixed $locationId * * @return mixed */ protected function getRealAliasId($locationId) { $data = $this->gateway->loadAutogeneratedEntry("eznode:" . $locationId); if (empty($data) || $data["id"] != 0 && $this->gateway->isRootEntry($data["id"])) { $id = 0; } else { $id = $data["id"]; } return $id; }
/** * Internal method for creating global or custom URL alias (these are handled in the same way). * * @throws \eZ\Publish\Core\Base\Exceptions\ForbiddenException if the path already exists for the given language * * @param string $action * @param string $path * @param bool $forward * @param string|null $languageCode * @param bool $alwaysAvailable * * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias */ protected function createUrlAlias($action, $path, $forward, $languageCode, $alwaysAvailable) { $pathElements = explode('/', $path); $topElement = array_pop($pathElements); $languageId = $this->languageHandler->loadByLanguageCode($languageCode)->id; $parentId = 0; // Handle all path elements except topmost one $isPathNew = false; foreach ($pathElements as $level => $pathElement) { $pathElement = $this->slugConverter->convert($pathElement, 'noname' . ($level + 1)); $pathElementMD5 = $this->getHash($pathElement); if (!$isPathNew) { $row = $this->gateway->loadRow($parentId, $pathElementMD5); if (empty($row)) { $isPathNew = true; } else { $parentId = $row['link']; } } if ($isPathNew) { $parentId = $this->insertNopEntry($parentId, $pathElement, $pathElementMD5); } } // Handle topmost path element $topElement = $this->slugConverter->convert($topElement, 'noname' . (count($pathElements) + 1)); // If last (next to topmost) entry parent is special root entry we handle topmost entry as first level entry // That is why we need to reset $parentId to 0 if ($parentId != 0 && $this->gateway->isRootEntry($parentId)) { $parentId = 0; } $topElementMD5 = $this->getHash($topElement); // Set common values for two cases below $data = array('action' => $action, 'is_alias' => 1, 'alias_redirects' => $forward ? 1 : 0, 'parent' => $parentId, 'text' => $topElement, 'text_md5' => $topElementMD5, 'is_original' => 1); // Try to load topmost element if (!$isPathNew) { $row = $this->gateway->loadRow($parentId, $topElementMD5); } // If nothing was returned perform insert if ($isPathNew || empty($row)) { $data['lang_mask'] = $languageId | (int) $alwaysAvailable; $id = $this->gateway->insertRow($data); } elseif ($row['action'] == 'nop:' || $row['is_original'] == 0) { // Row exists, check if it is reusable. There are 2 cases when this is possible: // 1. NOP entry // 2. history entry $data['lang_mask'] = $languageId | (int) $alwaysAvailable; // If history is reused move link to id $data['link'] = $id = $row['id']; $this->gateway->updateRow($parentId, $topElementMD5, $data); } else { throw new ForbiddenException("Path '%path%' already exists for the given language", ['%path%' => $path]); } $data['raw_path_data'] = $this->gateway->loadPathData($id); return $this->mapper->extractUrlAliasFromData($data); }