diff --git a/elements/export/search/page.php b/elements/export/search/page.php index 3ce62f99..88b70fa3 100755 --- a/elements/export/search/page.php +++ b/elements/export/search/page.php @@ -10,7 +10,13 @@ foreach ($list as $type) { $pagetypes[$type->getPageTypeID()] = $type->getPageTypeDisplayName(); } -$includeSystemPages = $includeSystemPages ?? 0; + +// Let's check if we have a class that has been introduced in the core when we added support for exporting page aliases and external links +if (class_exists('Concrete\Core\Backup\ContentImporter\Exception\MissingPageAtPathException')) { + $whyNoAdditionalTypes = ''; +} else { + $whyNoAdditionalTypes = t("Your version of ConcreteCMS doesn't support exporting external links and aliases: please upgrade to a newer version."); +} ?>
@@ -34,6 +40,36 @@
- checkbox('includeSystemPages', 1, $includeSystemPages); ?> - +
+ checkbox('includeSystemPages', 1, !empty($includeSystemPages)) ?> + +
+
+ checkbox('includeExternalLinks', 1, !empty($includeExternalLinks), $whyNoAdditionalTypes === '' ? [] : ['disabled' => 'disabled']) ?> + +
+
+ checkbox('includeAliases', 1, !empty($includeAliases), $whyNoAdditionalTypes === '' ? [] : ['disabled' => 'disabled']) ?> + +
diff --git a/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php b/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php index a0fdc336..8678c3c5 100644 --- a/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php +++ b/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php @@ -1,6 +1,7 @@ query->all(); + $query = $request->query; - $keywords = $query['keywords']; - $ptID = $query['ptID']; - $startingPoint = intval($query['startingPoint']); - $datetime = \Core::make('helper/form/date_time')->translate('datetime', $query); - $includeSystemPages = $query['includeSystemPages'] ?? 0; + $keywords = $query->get('keywords'); + $ptID = $query->getInt('ptID'); + $startingPoint = $query->getInt('startingPoint'); + $datetime = \Core::make('helper/form/date_time')->translate('datetime', $query->all()); + $includeSystemPages = $query->get('includeSystemPages'); + $includeAliases = $query->get('includeAliases'); $pl->ignorePermissions(); if ($startingPoint) { @@ -49,25 +51,37 @@ public function getResults(Request $request) if ($keywords) { $pl->filterByKeywords($keywords); } - if($includeSystemPages) { + if ($includeSystemPages) { $pl->includeSystemPages(); - } + } + if ($includeAliases) { + $pl->includeAliases(); + } $pl->setItemsPerPage(1000); $results = $pl->getResults(); - $items = array(); + $itemIDs = array(); if (isset($parent) && !$parent->isError()) { - $item = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Page(); - $item->setItemId($parent->getCollectionID()); - $items[] = $item; + $itemIDs[] = (int) $parent->getCollectionID(); } foreach ($results as $c) { - $item = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Page(); - $item->setItemId($c->getCollectionID()); - $items[] = $item; + $cID = $includeAliases ? $c->getCollectionPointerOriginalID() : 0; + $itemIDs[] = (int) ($cID ?: $c->getCollectionID()); + } + if ($query->get('includeExternalLinks')) { + foreach ($this->listExternalLinks($keywords, $parent) as $cID) { + $itemIDs[] = $cID; + } } - return $items; + return array_map( + static function ($cID) { + $item = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Page(); + $item->setItemId($cID); + return $item; + }, + array_values(array_unique($itemIDs)) + ); } public function getHandle() @@ -79,4 +93,43 @@ public function getPluralDisplayName() { return t('Pages'); } + + /** + * @param string $keywords + * @param \Concrete\Core\Page\Page|null $parent + * + * @return \Generator + */ + private function listExternalLinks($keywords, $parent = null) + { + $cn = app(Connection::class); + $qb = $cn->createQueryBuilder(); + $qb + ->select('p.cID') + ->from('Pages', 'p') + ->andWhere("p.cPointerExternalLink IS NOT NULL AND p.cPointerExternalLink <> ''") + ; + $keywords = trim((string) $keywords); + if ($keywords !== '') { + $qb + ->innerJoin('p', 'CollectionVersions', 'cv', 'p.cID = cv.cID') + ->andWhere('cv.cvID = (SELECT MAX(cvID) FROM CollectionVersions WHERE cID = cv.cID)') + ->andWhere('cv.cvName LIKE :keywords') + ->setParameter('keywords', "%{$keywords}%") + ; + } + $pathPrefix = $parent === null ? '' : ($parent->getCollectionPath() . '/'); + $rs = $qb->execute(); + while (($cID = $rs->fetchOne()) !== false) { + $cID = (int) $cID; + if ($pathPrefix !== '') { + $externalLink = \Concrete\Core\Page\Page::getByID($cID, 'RECENT'); + $externalLinkPath = $externalLink->generatePagePath(); + if (strpos($externalLinkPath, $pathPrefix) !== 0) { + continue; + } + } + yield $cID; + } + } } diff --git a/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php b/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php index 7e041a61..10b156e0 100644 --- a/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php +++ b/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php @@ -31,11 +31,21 @@ public function exportCollection(ObjectCollection $collection, \SimpleXMLElement public function getResultColumns(ExportItem $exportItem) { $c = \Page::getByID($exportItem->getItemIdentifier()); + if ($c->isExternalLink()) { + $path = h($c->generatePagePath()); + $path .= ' ' . h($c->getCollectionPointerExternalLink()); + } else { + $path = h($c->getCollectionPath() ?: '/'); + if ($c->isAliasPage()) { + $originalPage = \Page::getByID($c->getCollectionID()); + $path .= ' ' . h($originalPage->getCollectionPath()); + } + } - return array( - $c->getCollectionPath() ?: '/', - $c->getCollectionName(), - ); + return [ + $path, + h($c->getCollectionName()), + ]; } public function getItemsFromRequest($array) @@ -44,8 +54,13 @@ public function getItemsFromRequest($array) foreach ($array as $id) { $c = \Page::getByID($id); if (is_object($c) && !$c->isError()) { + if ($c->isAliasPage()) { + $cID = $c->getCollectionPointerOriginalID(); + } else { + $cID = $c->getCollectionID(); + } $page = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\SinglePage(); - $page->setItemId($c->getCollectionID()); + $page->setItemId($cID); $items[] = $page; } }