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.");
+}
?>
=t('Keywords')?>
@@ -34,6 +40,36 @@
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;
}
}