Skip to content
Extraits de code Groupes Projets
SetNumberOfCustomVariables.php 6,48 ko
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Piwik - Open source web analytics
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     *
     */
    
    namespace Piwik\Plugins\CustomVariables\Commands;
    
    use Piwik\Plugin\ConsoleCommand;
    use Piwik\Plugins\CustomVariables\Model;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
    
    /**
     */
    class SetNumberOfCustomVariables extends ConsoleCommand
    {
        /**
         * @var \Symfony\Component\Console\Helper\ProgressHelper
         */
        private $progress;
    
        protected function configure()
        {
            $this->setName('customvariables:set-number-available-custom-variables');
            $this->setDescription('Change the number of available custom variables');
            $this->setHelp("Example:
    ./console customvariables:set-number-available-custom-variables 10
    => 10 custom variables will be available in total
    ");
            $this->addArgument('maxCustomVars', InputArgument::REQUIRED, 'The number of available custom variables');
        }
    
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $numVarsToSet = $this->getNumVariablesToSet($input);
            $numChangesToPerform = $this->getNumberOfChangesToPerform($numVarsToSet);
    
            if (0 === $numChangesToPerform) {
                $this->writeSuccessMessage($output, array(
                    'Your Piwik is already configured for ' . $numVarsToSet . ' custom variables.'
                ));
                return;
            }
    
            foreach (Model::getScopes() as $scope) {
                $this->printChanges($scope, $numVarsToSet, $output);
            }
    
            if (!$this->confirmChange($output)) {
                return;
            }
    
            $output->writeln('');
            $output->writeln('Starting to apply changes');
            $output->writeln('');
    
            $this->progress = $this->initProgress($numChangesToPerform, $output);
    
            foreach (Model::getScopes() as $scope) {
                $this->performChange($scope, $numVarsToSet, $output);
            }
    
            $this->progress->finish();
    
            $this->writeSuccessMessage($output, array(
                'Your Piwik is now configured for ' . $numVarsToSet . ' custom variables.'
            ));
        }
    
        private function initProgress($numChangesToPerform, OutputInterface $output)
        {
            /** @var \Symfony\Component\Console\Helper\ProgressHelper $progress */
            $progress = $this->getHelperSet()->get('progress');
            $progress->start($output, $numChangesToPerform);
    
            return $progress;
        }
    
        private function performChange($scope, $numVarsToSet, OutputInterface $output)
        {
            $model = new Model($scope);
            $numCurrentVars = $model->getCurrentNumCustomVars();
            $numDifference  = $this->getAbsoluteDifference($numCurrentVars, $numVarsToSet);
    
            if ($numVarsToSet > $numCurrentVars) {
                $this->addCustomVariables($model, $numDifference, $output);
                return;
            }
    
            $this->removeCustomVariables($model, $numDifference, $output);
        }
    
        private function getNumVariablesToSet(InputInterface $input)
        {
            $maxCustomVars = $input->getArgument('maxCustomVars');
    
            if (!is_numeric($maxCustomVars)) {
                throw new \Exception('The number of available custom variables has to be number');
            }
    
            $maxCustomVars = (int) $maxCustomVars;
    
            if ($maxCustomVars <= 0) {
                throw new \Exception('There has to be at least 1 custom variable');
            }
    
            return $maxCustomVars;
        }
    
        private function confirmChange(OutputInterface $output)
        {
            $output->writeln('');
    
            $dialog = $this->getHelperSet()->get('dialog');
            return $dialog->askConfirmation(
                $output,
                '<question>Are you sure you want to perform these actions? (y/N)</question>',
                false
            );
        }
    
        private function printChanges($scope, $numVarsToSet, OutputInterface $output)
        {
            $model                = new Model($scope);
            $scopeName            = $model->getScopeName();
            $highestIndex         = $model->getHighestCustomVarIndex();
            $numCurrentCustomVars = $model->getCurrentNumCustomVars();
            $numVarsDifference    = $this->getAbsoluteDifference($numCurrentCustomVars, $numVarsToSet);
    
            $output->writeln('');
            $output->writeln(sprintf('Scope "%s"', $scopeName));
    
            if ($numVarsToSet > $numCurrentCustomVars) {
    
                $indexes = implode(',', range($highestIndex + 1, $highestIndex + $numVarsDifference));
                $output->writeln(
                    sprintf('%s new custom variables having the index(es) %s will be ADDED', $numVarsDifference, $indexes)
                );
    
            } elseif ($numVarsToSet < $numCurrentCustomVars) {
    
                $indexes = implode(',', range($highestIndex - $numVarsDifference + 1, $highestIndex));
                $output->writeln(
                    sprintf("%s existing custom variables having the index(es) %s will be REMOVED.", $numVarsDifference, $indexes)
                );
                $output->writeln('<comment>This is an irreversible change</comment>');
            }
        }
    
        private function getAbsoluteDifference($currentNumber, $numberToSet)
        {
            return abs($numberToSet - $currentNumber);
        }
    
        private function removeCustomVariables(Model $model, $numberOfVarsToRemove, OutputInterface $output)
        {
            for ($index = 0; $index < $numberOfVarsToRemove; $index++) {
                $indexRemoved = $model->removeCustomVariable();
                $this->progress->advance();
                $output->writeln('  <info>Removed a variable in scope "' . $model->getScopeName() .  '" having the index ' . $indexRemoved . '</info>');
            }
        }
    
        private function addCustomVariables(Model $model, $numberOfVarsToAdd, OutputInterface $output)
        {
            for ($index = 0; $index < $numberOfVarsToAdd; $index++) {
                $indexAdded = $model->addCustomVariable();
                $this->progress->advance();
                $output->writeln('  <info>Added a variable in scope "' . $model->getScopeName() .  '" having the index ' . $indexAdded . '</info>');
            }
        }
    
        private function getNumberOfChangesToPerform($numVarsToSet)
        {
            $numChangesToPerform = 0;
    
            foreach (Model::getScopes() as $scope) {
                $model = new Model($scope);
                $numCurrentCustomVars = $model->getCurrentNumCustomVars();
                $numChangesToPerform += $this->getAbsoluteDifference($numCurrentCustomVars, $numVarsToSet);
            }
            
            return $numChangesToPerform;
        }
    }