From 6764f9dd35b5eeebf046a7318a6aa632a2cf9da7 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Fri, 6 Sep 2024 14:35:42 +1200 Subject: [PATCH] API Update API to reflect changes to CLI interaction --- src/Tasks/SubsiteCopyPagesTask.php | 73 ++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/src/Tasks/SubsiteCopyPagesTask.php b/src/Tasks/SubsiteCopyPagesTask.php index 375806ac..6cfdd541 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. @@ -22,32 +26,37 @@ */ 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; } }