diff --git a/src/Model/Subsite.php b/src/Model/Subsite.php index 6cc33ded..6ac27e0c 100644 --- a/src/Model/Subsite.php +++ b/src/Model/Subsite.php @@ -263,7 +263,7 @@ public static function getSubsiteIDForDomain($host = null, $checkPermissions = t // ClassInfo::hasTable provides a cached table list if (!ClassInfo::hasTable($domainTableName)) { - // Table hasn't been created yet. Might be a dev/build, skip. + // Table hasn't been created yet. Might be bilding the db, skip. return 0; } diff --git a/src/Tasks/SubsiteCopyPagesTask.php b/src/Tasks/SubsiteCopyPagesTask.php index 375806ac..a5894756 100644 --- a/src/Tasks/SubsiteCopyPagesTask.php +++ b/src/Tasks/SubsiteCopyPagesTask.php @@ -2,13 +2,17 @@ namespace SilverStripe\Subsites\Tasks; -use InvalidArgumentException; +use Closure; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Dev\BuildTask; +use SilverStripe\HybridExecution\HybridOutput; use SilverStripe\ORM\DataObject; use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Pages\SubsitesVirtualPage; use SilverStripe\Versioned\Versioned; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; /** * Handy alternative to copying pages when creating a subsite through the UI. @@ -16,38 +20,43 @@ * Can be used to batch-add new pages after subsite creation, or simply to * process a large site outside of the UI. * - * Example: sake dev/tasks/SubsiteCopyPagesTask from= to= + * Example: sake tasks:SubsiteCopyPagesTask --from= --to= * * @package subsites */ class SubsiteCopyPagesTask extends BuildTask { - protected $title = 'Copy pages to different subsite'; - protected $description = ''; + protected string $title = 'Copy pages to different subsite'; - private static $segment = 'SubsiteCopyPagesTask'; + protected static string $description = 'Handy alternative to copying pages when creating a subsite through the UI'; - public function run($request) + protected static string $commandName = 'SubsiteCopyPagesTask'; + + protected function execute(InputInterface $input, HybridOutput $output): int { - $subsiteFromId = $request->getVar('from'); + $subsiteFromId = $input->getOption('from'); if (!is_numeric($subsiteFromId)) { - throw new InvalidArgumentException('Missing "from" parameter'); + $output->writeln('Missing "from" parameter'); + return Command::INVALID; } $subsiteFrom = DataObject::get_by_id(Subsite::class, $subsiteFromId); if (!$subsiteFrom) { - throw new InvalidArgumentException('Subsite not found'); + $output->writeln('Subsite not found'); + return Command::FAILURE; } - $subsiteToId = $request->getVar('to'); + $subsiteToId = $input->getOption('to'); if (!is_numeric($subsiteToId)) { - throw new InvalidArgumentException('Missing "to" parameter'); + $output->writeln('Missing "to" parameter'); + return Command::INVALID; } $subsiteTo = DataObject::get_by_id(Subsite::class, $subsiteToId); if (!$subsiteTo) { - throw new InvalidArgumentException('Subsite not found'); + $output->writeln('Subsite not found'); + return Command::FAILURE; } - $useVirtualPages = (bool)$request->getVar('virtual'); + $useVirtualPages = $input->getOption('virtual'); Subsite::changeSubsite($subsiteFrom); @@ -77,16 +86,50 @@ public function run($request) $childClone->copyVersionToStage('Stage', 'Live'); array_push($stack, [$child->ID, $childClone->ID]); - $this->log(sprintf('Copied "%s" (#%d, %s)', $child->Title, $child->ID, $child->Link())); + $output->writeln(sprintf('Copied "%s" (#%d, %s)', $child->Title, $child->ID, $child->Link())); } } unset($children); } + + return Command::SUCCESS; + } + + public function getOptions(): array + { + $subsiteSuggestionClosure = Closure::fromCallable([static::class, 'getSubsiteCompletion']); + return [ + new InputOption( + 'from', + null, + InputOption::VALUE_REQUIRED, + 'ID of the subsite to copy from', + suggestedValues: $subsiteSuggestionClosure + ), + new InputOption( + 'to', + null, + InputOption::VALUE_REQUIRED, + 'ID of the subsite to copy to', + suggestedValues: $subsiteSuggestionClosure + ), + new InputOption( + 'virtual', + null, + InputOption::VALUE_NONE, + 'Create virtual pages instead of duplicating pages' + ), + ]; } - public function log($msg) + public static function getSubsiteCompletion(): array { - echo $msg . "\n"; + $subsites = Subsite::get()->map('ID', 'Title'); + $suggestions = []; + foreach ($subsites as $id => $title) { + $suggestions[] = "{$id}\t{$title}"; + } + return $suggestions; } }