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 @@
-
+
-
-
-
-
-
-
-
=t('Files')?>
-
=t('No referenced files found.')?>
-
+
= t('Files') ?>
+
= t('No referenced files found.') ?>
+
+
= t('Content XML') ?>
+
+
+
+
+
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;
}