Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
IndexerSetDimensionsModeCommand.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
10 use Symfony\Component\Console\Input\InputInterface;
11 use Symfony\Component\Console\Output\OutputInterface;
12 use Symfony\Component\Console\Input\InputArgument;
17 
22 {
23  const INPUT_KEY_MODE = 'mode';
24  const INPUT_KEY_INDEXER = 'indexer';
25  const DIMENSION_MODE_NONE = 'none';
26  const XML_PATH_DIMENSIONS_MODE_MASK = 'indexer/%s/dimensions_mode';
27 
31  private $commandName = 'indexer:set-dimensions-mode';
32 
38  private $configReader;
39 
43  private $dimensionProviders;
44 
50  public function __construct(
51  ObjectManagerFactory $objectManagerFactory,
52  ScopeConfigInterface $configReader,
53  array $dimensionSwitchers
54  ) {
55  $this->configReader = $configReader;
56  $this->dimensionProviders = $dimensionSwitchers;
57  parent::__construct($objectManagerFactory);
58  }
59 
63  protected function configure()
64  {
65  $this->setName($this->commandName)
66  ->setDescription('Set Indexer Dimensions Mode')
67  ->setDefinition($this->getInputList());
68  parent::configure();
69  }
70 
77  protected function execute(InputInterface $input, OutputInterface $output)
78  {
79  $errors = $this->validate($input);
80  if ($errors) {
81  throw new \InvalidArgumentException(implode(PHP_EOL, $errors));
82  }
83  $returnValue = Cli::RETURN_SUCCESS;
85  $indexer = $this->getObjectManager()->get(\Magento\Indexer\Model\Indexer::class);
86  try {
87  $selectedIndexer = (string)$input->getArgument(self::INPUT_KEY_INDEXER);
88  if (!$selectedIndexer) {
89  $this->showAvailableModes($output);
90  } else {
91  $indexer->load($selectedIndexer);
92  $currentMode = $input->getArgument(self::INPUT_KEY_MODE);
93  $configPath = sprintf(self::XML_PATH_DIMENSIONS_MODE_MASK, $selectedIndexer);
94  $previousMode = $this->configReader->getValue($configPath) ?: self::DIMENSION_MODE_NONE;
95  if ($previousMode !== $currentMode) {
97  $modeSwitcher = $this->dimensionProviders[$selectedIndexer];
98  // Switch dimensions mode
99  $modeSwitcher->switchMode($currentMode, $previousMode);
100  $output->writeln(
101  'Dimensions mode for indexer "' . $indexer->getTitle() . '" was changed from \''
102  . $previousMode . '\' to \'' . $currentMode . '\''
103  );
104  } else {
105  $output->writeln('Dimensions mode for indexer "' . $indexer->getTitle() . '" has not been changed');
106  }
107  }
108  } catch (\Exception $e) {
109  $output->writeln('"' . $indexer->getTitle() . '" indexer process unknown error:' . PHP_EOL);
110  $output->writeln($e->getMessage() . PHP_EOL);
111  // we must have an exit code higher than zero to indicate something was wrong
112  $returnValue = Cli::RETURN_FAILURE;
113  }
114 
115  return $returnValue;
116  }
117 
124  private function showAvailableModes(OutputInterface $output)
125  {
126  $output->writeln(sprintf('%-50s', 'Indexer') . 'Available modes');
127  foreach ($this->dimensionProviders as $indexer => $provider) {
128  $availableModes = implode(',', array_keys($provider->getDimensionModes()->getDimensions()));
129  $output->writeln(sprintf('%-50s', $indexer) . $availableModes);
130  }
131  }
132 
138  private function getInputList(): array
139  {
140  $dimensionProvidersList = array_keys($this->dimensionProviders);
141  $indexerOptionDescription = 'Indexer name [' . implode('|', $dimensionProvidersList) . ']';
142  $arguments[] = new InputArgument(
143  self::INPUT_KEY_INDEXER,
144  InputArgument::OPTIONAL,
145  $indexerOptionDescription
146  );
147  $modeOptionDescription = 'Indexer dimension modes' . PHP_EOL;
148  foreach ($this->dimensionProviders as $indexer => $provider) {
149  $availableModes = implode(',', array_keys($provider->getDimensionModes()->getDimensions()));
150  $modeOptionDescription .= sprintf('%-30s ', $indexer) . $availableModes . PHP_EOL;
151  }
152  $arguments[] = new InputArgument(
153  self::INPUT_KEY_MODE,
154  InputArgument::OPTIONAL,
155  $modeOptionDescription
156  );
157 
158  return $arguments;
159  }
160 
167  private function validate(InputInterface $input): array
168  {
169  $errors = [];
170  $inputIndexer = (string)$input->getArgument(self::INPUT_KEY_INDEXER);
171  if ($inputIndexer) {
172  $acceptedValues = array_keys($this->dimensionProviders);
173  $errors = $this->validateArgument(self::INPUT_KEY_INDEXER, $inputIndexer, $acceptedValues);
174  if (!$errors) {
175  $inputIndexerDimensionMode = (string)$input->getArgument(self::INPUT_KEY_MODE);
177  $modeSwitcher = $this->dimensionProviders[$inputIndexer];
178  $acceptedValues = array_keys($modeSwitcher->getDimensionModes()->getDimensions());
179  $errors = $this->validateArgument(self::INPUT_KEY_MODE, $inputIndexerDimensionMode, $acceptedValues);
180  }
181  }
182 
183  return $errors;
184  }
185 
194  private function validateArgument(string $inputKey, string $inputIndexer, array $acceptedValues): array
195  {
196  $errors = [];
197  $acceptedIndexerValues = ' Accepted values for "<' . $inputKey . '>" are \'' .
198  implode(',', $acceptedValues) . '\'';
199  if (!$inputIndexer) {
200  $errors[] = 'Missing argument "<' . $inputKey . '>".' . $acceptedIndexerValues;
201  } elseif (!\in_array($inputIndexer, $acceptedValues)) {
202  $errors[] = 'Invalid value for "<' . $inputKey . '>" argument.' . $acceptedIndexerValues;
203  }
204 
205  return $errors;
206  }
207 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$objectManagerFactory
$arguments
__construct(ObjectManagerFactory $objectManagerFactory, ScopeConfigInterface $configReader, array $dimensionSwitchers)
$errors
Definition: overview.phtml:9