diff --git a/packages/migration_tool/controllers/single_page/dashboard/system/migration/export.php b/packages/migration_tool/controllers/single_page/dashboard/system/migration/export.php index 7fce89c..1e48ba4 100644 --- a/packages/migration_tool/controllers/single_page/dashboard/system/migration/export.php +++ b/packages/migration_tool/controllers/single_page/dashboard/system/migration/export.php @@ -4,7 +4,6 @@ use Concrete\Core\Application\EditResponse; use Concrete\Core\File\File; use Concrete\Core\Page\Controller\DashboardSitePageController; -use Concrete\Package\MigrationTool\Page\Controller\DashboardPageController; use Doctrine\Common\Collections\ArrayCollection; use PortlandLabs\Concrete5\MigrationTool\Entity\Export\Batch; use PortlandLabs\Concrete5\MigrationTool\Entity\Export\ObjectCollection; @@ -81,16 +80,34 @@ public function export_batch($id = null) { $r = $this->entityManager->getRepository('\PortlandLabs\Concrete5\MigrationTool\Entity\Export\Batch'); $batch = $r->findOneById($id); - if (is_object($batch)) { - $exporter = new Exporter($batch); - $files = $exporter->getReferencedFiles(); - $this->set('files', $files); - $this->set('batch', $batch); - $this->set('pageTitle', t('Export Batch')); - $this->render('/dashboard/system/migration/finalize_export_batch'); - } else { - $this->view(); + if ($batch === null) { + return $this->view(); } + $this->set('batch', $batch); + $exporter = new Exporter($batch); + $files = $exporter->getReferencedFiles(); + $this->set('files', $files); + $sx = $exporter->getElement(); + $xml = $sx->saveXML(); + try { + $doc = new \DOMDocument(); + $doc->preserveWhiteSpace = false; + $doc->formatOutput = true; + $flags = 0 | (defined('LIBXML_BIGLINES') ? LIBXML_BIGLINES : 0); + $restore = libxml_use_internal_errors(true); + try { + if ($doc->loadXML($xml, $flags) !== false && !libxml_get_errors()) { + $xml = $doc->saveXML(); + } + } finally { + libxml_use_internal_errors($restore); + } + } catch (\Exception $_) { + } catch (\Throwable $_) { + } + $this->set('xml', $xml); + $this->set('pageTitle', t('Export Batch')); + $this->render('/dashboard/system/migration/finalize_export_batch'); } public function download_files() @@ -152,25 +169,6 @@ public function download_files() exit; } - public function export_batch_xml($id = null) - { - $r = $this->entityManager->getRepository('\PortlandLabs\Concrete5\MigrationTool\Entity\Export\Batch'); - $batch = $r->findOneById($id); - if (is_object($batch)) { - $exporter = new Exporter($batch); - if ($this->request->request->get('download')) { - header('Content-disposition: attachment; filename="export.xml"'); - header('Content-type: "text/xml"; charset="utf8"'); - } else { - header('Content-type: text/xml'); - } - echo $exporter->getElement()->asXML(); - exit; - } else { - $this->view(); - } - } - public function add_items_to_batch() { if (!$this->token->validate('add_items_to_batch')) { diff --git a/packages/migration_tool/elements/export/search/page.php b/packages/migration_tool/elements/export/search/page.php index 9a4fada..b49c69c 100755 --- a/packages/migration_tool/elements/export/search/page.php +++ b/packages/migration_tool/elements/export/search/page.php @@ -10,6 +10,12 @@ foreach ($list as $type) { $pagetypes[$type->getPageTypeID()] = $type->getPageTypeDisplayName(); } +// 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 concrete5 doesn't support exporting external links and aliases: please upgrade to a newer version."); +} ?>
@@ -34,6 +40,35 @@
- +
+
+ +
+
+ +
diff --git a/packages/migration_tool/single_pages/dashboard/system/migration/finalize_export_batch.php b/packages/migration_tool/single_pages/dashboard/system/migration/finalize_export_batch.php index ad892dc..d058173 100755 --- a/packages/migration_tool/single_pages/dashboard/system/migration/finalize_export_batch.php +++ b/packages/migration_tool/single_pages/dashboard/system/migration/finalize_export_batch.php @@ -1,12 +1,25 @@ - +
- +
- - - - -
- - output('download_files')?> - -

- + + output('download_files') ?> + + +

- - - - - - - - - - - + + + - + + + + + + + + +
getFileID()?>getFileName()?>
getFileID() ?>getFileName()) ?>
- -

-

- +

+

+ +

+
+ + +
+ diff --git a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Exporter.php b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Exporter.php index 1d9453e..77c94b1 100644 --- a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Exporter.php +++ b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Exporter.php @@ -8,8 +8,14 @@ class Exporter { + /** + * @var \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Batch + */ protected $batch; - protected $built = false; + + /** + * @var \SimpleXMLElement|null + */ protected $element; public function __construct(Batch $batch) @@ -27,9 +33,12 @@ protected function build() } } + /** + * @return \SimpleXMLElement + */ public function getElement() { - if (!$this->built) { + if (!$this->element) { $this->build(); } @@ -38,6 +47,8 @@ public function getElement() /** * Loops through all pages and returns files referenced. + * + * @return \Concrete\Core\Entity\File\File[] */ public function getReferencedFiles() { diff --git a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php index 4a81f00..c889e81 100644 --- a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Page.php +++ b/packages/migration_tool/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']; + $keywords = $query->get('keywords'); + $ptID = $query->get('ptID'); + $startingPoint = (int) $query->get('startingPoint'); + $datetime = \Core::make('helper/form/date_time')->translate('datetime', $query->all()); + $includeSystemPages = $query->get('includeSystemPages'); + $includeAliases = $query->get('includeAliases'); $pl->ignorePermissions(); if ($startingPoint) { @@ -38,6 +40,7 @@ public function getResults(Request $request) $siteTree = $parent->getSiteTreeObject(); } else { $siteTree = \Core::make('site')->getActiveSiteForEditing()->getSiteTreeObject(); + $parent = null; } $pl->setSiteTreeObject($siteTree); if ($datetime) { @@ -49,10 +52,12 @@ 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(); @@ -63,9 +68,17 @@ public function getResults(Request $request) } foreach ($results as $c) { $item = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Page(); - $item->setItemId($c->getCollectionID()); + $cID = $includeAliases ? $c->getCollectionPointerOriginalID() : 0; + $item->setItemId($cID ?: $c->getCollectionID()); $items[] = $item; } + if ($query->get('includeExternalLinks')) { + foreach ($this->listExternalLinks($keywords, $parent) as $cID) { + $item = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\Page(); + $item->setItemId($cID); + $items[] = $item; + } + } return $items; } @@ -79,4 +92,44 @@ 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 = \Core::make(Connection::class); + /* @var Connection $cn */ + $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->fetchColumn()) !== false) { + $cID = (int) $cID; + if ($pathPrefix !== '') { + $externalLink = \Page::getByID($cID, 'RECENT'); + $externalLinkPath = $externalLink->generatePagePath(); + if (strpos($externalLinkPath, $pathPrefix) !== 0) { + continue; + } + } + yield $cID; + } + } } diff --git a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php index e7165bb..f099a68 100644 --- a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php +++ b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/SinglePage.php @@ -31,10 +31,19 @@ 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(), + $path, + h($c->getCollectionName()), ); } @@ -45,7 +54,7 @@ public function getItemsFromRequest($array) $c = \Page::getByID($id); if (is_object($c) && !$c->isError()) { $page = new \PortlandLabs\Concrete5\MigrationTool\Entity\Export\SinglePage(); - $page->setItemId($c->getCollectionID()); + $page->setItemId($c->getCollectionPointerOriginalID() ?: $c->getCollectionID()); $items[] = $page; } } diff --git a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Stack.php b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Stack.php index 778b728..7354bf7 100644 --- a/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Stack.php +++ b/packages/migration_tool/src/PortlandLabs/Concrete5/MigrationTool/Exporter/Item/Type/Stack.php @@ -51,7 +51,11 @@ public function getResultColumns(ExportItem $exportItem) break; default: $c = \Concrete\Core\Page\Stack\Stack::getByID($exportItem->getItemIdentifier()); - $type = t('Stack'); + if ($c && !$c->isError() && $c->getStackType() == $c::ST_TYPE_GLOBAL_AREA) { + $type = t('Global Area'); + } else { + $type = t('Stack'); + } break; }