setName('customdimensions:add-custom-dimension'); $this->setDescription('Add new Custom Dimension available.'); $this->setHelp("Example: ./console customdimensions:add-custom-dimension --scope=action --count=10 => Will add 10 new Custom Dimensions in scope 'action'. "); $description = sprintf('The scope of the Custom Dimension to add, either "%s" or "%s"', CustomDimensions::SCOPE_VISIT, CustomDimensions::SCOPE_ACTION); $this->addRequiredValueOption('scope', null, $description); $this->addRequiredValueOption('count', null, 'Define how many Custom Dimensions shall be added', '1'); } protected function doExecute(): int { $input = $this->getInput(); $output = $this->getOutput(); $scope = $this->getScope(); $count = $this->getCount(); $output->writeln(sprintf('Adding %d Custom Dimension(s) in scope %s.', $count, $scope)); $output->writeln('This causes schema changes in the database and may take a very long time.'); $noInteraction = $input->getOption('no-interaction'); if (!$noInteraction && !$this->confirmChange()) { return self::FAILURE; } $output->writeln(''); $output->writeln('Starting to add Custom Dimension(s)'); $output->writeln(''); $tracking = new LogTable($scope); $tracking->addManyCustomDimensions($count); if ($scope === CustomDimensions::SCOPE_VISIT) { $tracking = new LogTable(CustomDimensions::SCOPE_CONVERSION); $tracking->addManyCustomDimensions($count); } Cache::clearCacheGeneral(); $numDimensionsAvailable = $tracking->getNumInstalledIndexes(); $this->writeSuccessMessage( sprintf('Your Matomo is now configured for up to %d Custom Dimensions in scope %s.', $numDimensionsAvailable, $scope) ); return self::SUCCESS; } private function getScope() { $scope = $this->getInput()->getOption('scope'); if (empty($scope) || !in_array($scope, CustomDimensions::getScopes())) { // we also allow scope "conversion" in case on needs to repair something but we don't document as it would be rather confusing $message = sprintf('The specified scope is invalid. Use either "--scope=%s" or "--scope=%s"', CustomDimensions::SCOPE_VISIT, CustomDimensions::SCOPE_ACTION); throw new \InvalidArgumentException($message); } return $scope; } private function getCount() { $count = $this->getInput()->getOption('count'); if (!is_numeric($count)) { throw new \InvalidArgumentException('Option "count" must be a number'); } $count = (int) $count; if ($count <= 0) { throw new \InvalidArgumentException('Option "count" must be at least one'); } return $count; } private function confirmChange() { $this->getOutput()->writeln(''); return $this->askForConfirmation( 'Are you sure you want to perform this action? (y/N)', false ); } }