/** * Translate URL parameters for articles. * * @param ChangelanguageNavigationEvent $event */ public function onChangelanguageNavigation(ChangelanguageNavigationEvent $event) { // Try to find matching article if ($event->getNavigationItem()->isCurrentPage() || !$event->getUrlParameterBag()->hasUrlAttribute('articles')) { return; } /** @var PageModel $objPage */ global $objPage; $parameterBag = $event->getUrlParameterBag(); $currentArticle = ArticleModel::findByIdOrAliasAndPid($parameterBag->getUrlAttribute('articles'), $objPage->id); if (null === $currentArticle) { return; } $pageFinder = new PageFinder(); $targetRoot = $event->getNavigationItem()->getRootPage(); $masterRoot = $pageFinder->findMasterRootForPage($targetRoot); $targetArticle = $this->findTargetArticle($currentArticle, $targetRoot->id, $objPage->rootId === $masterRoot->id, null !== $masterRoot && $targetRoot->id === $masterRoot->id); if (null === $targetArticle) { $parameterBag->removeUrlAttribute('articles'); } else { $parameterBag->setUrlAttribute('articles', $targetArticle->alias); } }
/** * Limits the available pages in page picker to the fallback page tree. * * @param int $pageId */ private function setRootNodesForPage($pageId) { $page = PageModel::findWithDetails($pageId); $root = PageModel::findByPk($page->rootId); if ($root->fallback && (!$root->languageRoot || ($languageRoot = PageModel::findByPk($root->languageRoot)) === null)) { return; } $pageFinder = new PageFinder(); $masterRoot = $pageFinder->findMasterRootForPage($page); if (null !== $masterRoot) { $GLOBALS['TL_DCA']['tl_page']['fields']['languageMain']['eval']['rootNodes'] = Database::getInstance()->prepare('SELECT id FROM tl_page WHERE pid=?')->execute($masterRoot->id)->fetchEach('id'); } }
private function validateLanguageMainForPage($pageId) { $page = PageModel::findWithDetails($pageId); // Moving a root page does not affect language assignments if (null === $page || !$page->languageMain || 'root' === $page->type) { return; } $duplicates = PageModel::countBy(['id IN (' . implode(',', Database::getInstance()->getChildRecords($page->rootId, 'tl_page')) . ')', 'languageMain=?', 'id!=?'], [$page->languageMain, $page->id]); // Reset languageMain if another page in the new page tree has the same languageMain if ($duplicates > 0) { $this->resetPageAndChildren($page->id); return; } $pageFinder = new PageFinder(); $masterRoot = $pageFinder->findMasterRootForPage($page); // Reset languageMain if current tree has no master or if it's the master tree if (null === $masterRoot || $masterRoot->id === $page->rootId) { $this->resetPageAndChildren($page->id); return; } // Reset languageMain if the current value is not a valid ID of the master tree if (!in_array($page->id, Database::getInstance()->getChildRecords($masterRoot->id, 'tl_page'), false)) { $this->resetPageAndChildren($page->id); } }