/** * Computes the URL of a page according to a scheme. * * @param array $scheme The scheme to apply * @param Page $page The page * @param AbstractClassContent $content The optionnal main content of the page * @return string The generated URL */ private function doGenerate($scheme, Page $page, AbstractClassContent $content = null) { $replacement = ['$parent' => $page->isRoot() ? '' : $page->getParent()->getUrl(false), '$title' => StringUtils::urlize($page->getTitle()), '$datetime' => $page->getCreated()->format('ymdHis'), '$date' => $page->getCreated()->format('ymd'), '$time' => $page->getCreated()->format('His')]; $matches = []; if (preg_match_all('/(\\$content->[a-z]+)/i', $scheme, $matches)) { foreach ($matches[1] as $pattern) { $property = explode('->', $pattern); $property = array_pop($property); try { $replacement[$pattern] = StringUtils::urlize($content->{$property}); } catch (\Exception $e) { $replacement[$pattern] = ''; } } } $matches = []; if (preg_match_all('/(\\$ancestor\\[([0-9]+)\\])/i', $scheme, $matches)) { foreach ($matches[2] as $level) { $ancestor = $this->application->getEntityManager()->getRepository('BackBee\\CoreDomain\\NestedNode\\Page')->getAncestor($page, $level); if (null !== $ancestor && $page->getLevel() > $level) { $replacement['$ancestor[' . $level . ']'] = $ancestor->getUrl(false); } else { $replacement['$ancestor[' . $level . ']'] = ''; } } } $url = preg_replace('/\\/+/', '/', str_replace(array_keys($replacement), array_values($replacement), $scheme)); return $this->getUniqueness($page, $url); }
/** * Copy a page to a new one. * * @param Page $page The page to be copied. * @param string|null $title Optional, the title of the copy, if null (default) the title of the copied page. * @param Page|null $parent Optional, the parent of the copy, if null (default) the parent of the copied page. * * @return Page The copy of the page. * * @throws InvalidArgumentException Raises if the page is deleted. */ private function copy(Page $page, $title = null, Page $parent = null) { if (Page::STATE_DELETED & $page->getState()) { throw new InvalidArgumentException('Cannot duplicate a deleted page.'); } // Cloning the page $new_page = clone $page; $new_page->setTitle(null === $title ? $page->getTitle() : $title)->setLayout($page->getLayout()); // Setting the clone as first child of the parent if (null !== $parent) { $new_page = $this->insertNodeAsFirstChildOf($new_page, $parent, $new_page->hasMainSection()); } // Persisting entities $this->_em->persist($new_page); return $new_page; }