Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions elements/export/search/page.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
}
?>
<div class="form-group">
<label class="form-label"><?=t('Keywords')?></label>
Expand All @@ -34,6 +40,36 @@
</div>

<div class="form-group">
<?php echo $form->checkbox('includeSystemPages', 1, $includeSystemPages); ?>
<label class="form-check-label" for="includeSystemPages"><?=t('Include System Pages'); ?></label>
<div>
<?= $form->checkbox('includeSystemPages', 1, !empty($includeSystemPages)) ?>
<label class="form-check-label" for="includeSystemPages">
<?= t('Include System Pages') ?>
</label>
</div>
<div>
<?= $form->checkbox('includeExternalLinks', 1, !empty($includeExternalLinks), $whyNoAdditionalTypes === '' ? [] : ['disabled' => 'disabled']) ?>
<label class="form-check-label" for="includeExternalLinks">
<?= t('Include External Links') ?>
<?php
if ($whyNoAdditionalTypes !== '') {
?>
<i class="fas fa-ban text-warning launch-tooltip" title="<?= h($whyNoAdditionalTypes) ?>"></i>
<?php
}
?>
</label>
</div>
<div>
<?= $form->checkbox('includeAliases', 1, !empty($includeAliases), $whyNoAdditionalTypes === '' ? [] : ['disabled' => 'disabled']) ?>
<label class="form-check-label" for="includeAliases">
<?= t('Include Page Aliases') ?>
<?php
if ($whyNoAdditionalTypes !== '') {
?>
<i class="fas fa-ban text-warning launch-tooltip" title="<?= h($whyNoAdditionalTypes) ?>"></i>
<?php
}
?>
</label>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php
namespace PortlandLabs\Concrete5\MigrationTool\Exporter\Item\Type;

use Concrete\Core\Database\Connection\Connection;
use Concrete\Core\Page\PageList;
use PortlandLabs\Concrete5\MigrationTool\Entity\Export\ObjectCollection;
use Symfony\Component\HttpFoundation\Request;
Expand All @@ -23,13 +24,14 @@ public function exportCollection(ObjectCollection $collection, \SimpleXMLElement
public function getResults(Request $request)
{
$pl = new PageList();
$query = $request->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) {
Expand All @@ -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()
Expand All @@ -79,4 +93,43 @@ public function getPluralDisplayName()
{
return t('Pages');
}

/**
* @param string $keywords
* @param \Concrete\Core\Page\Page|null $parent
*
* @return \Generator<int>
*/
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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 .= ' <i class="fas fa-external-link-alt"></i> ' . h($c->getCollectionPointerExternalLink());
} else {
$path = h($c->getCollectionPath() ?: '/');
if ($c->isAliasPage()) {
$originalPage = \Page::getByID($c->getCollectionID());
$path .= ' <i class="fas fa-sign-out-alt"></i> ' . h($originalPage->getCollectionPath());
}
}

return array(
$c->getCollectionPath() ?: '/',
$c->getCollectionName(),
);
return [
$path,
h($c->getCollectionName()),
];
}

public function getItemsFromRequest($array)
Expand All @@ -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;
}
}
Expand Down