6 declare(strict_types=1);
10 use Symfony\Component\Console\Input\InputInterface;
11 use Symfony\Component\Console\Output\OutputInterface;
12 use Symfony\Component\Console\Input\InputArgument;
31 private $commandName =
'indexer:set-dimensions-mode';
38 private $configReader;
43 private $dimensionProviders;
53 array $dimensionSwitchers
55 $this->configReader = $configReader;
56 $this->dimensionProviders = $dimensionSwitchers;
65 $this->setName($this->commandName)
66 ->setDescription(
'Set Indexer Dimensions Mode')
67 ->setDefinition($this->getInputList());
77 protected function execute(InputInterface $input, OutputInterface
$output)
79 $errors = $this->validate($input);
81 throw new \InvalidArgumentException(implode(PHP_EOL,
$errors));
85 $indexer = $this->getObjectManager()->get(\
Magento\Indexer\Model\Indexer::class);
87 $selectedIndexer = (string)$input->getArgument(self::INPUT_KEY_INDEXER);
88 if (!$selectedIndexer) {
89 $this->showAvailableModes(
$output);
92 $currentMode = $input->getArgument(self::INPUT_KEY_MODE);
93 $configPath = sprintf(self::XML_PATH_DIMENSIONS_MODE_MASK, $selectedIndexer);
95 if ($previousMode !== $currentMode) {
97 $modeSwitcher = $this->dimensionProviders[$selectedIndexer];
99 $modeSwitcher->switchMode($currentMode, $previousMode);
101 'Dimensions mode for indexer "' .
$indexer->getTitle() .
'" was changed from \'' 102 . $previousMode .
'\' to \
'' . $currentMode .
'\'' 105 $output->writeln(
'Dimensions mode for indexer "' .
$indexer->getTitle() .
'" has not been changed');
108 }
catch (\Exception $e) {
109 $output->writeln(
'"' .
$indexer->getTitle() .
'" indexer process unknown error:' . PHP_EOL);
110 $output->writeln($e->getMessage() . PHP_EOL);
124 private function showAvailableModes(OutputInterface
$output)
126 $output->writeln(sprintf(
'%-50s',
'Indexer') .
'Available modes');
127 foreach ($this->dimensionProviders as
$indexer => $provider) {
128 $availableModes = implode(
',', array_keys($provider->getDimensionModes()->getDimensions()));
138 private function getInputList(): array
140 $dimensionProvidersList = array_keys($this->dimensionProviders);
141 $indexerOptionDescription =
'Indexer name [' . implode(
'|', $dimensionProvidersList) .
']';
143 self::INPUT_KEY_INDEXER,
144 InputArgument::OPTIONAL,
145 $indexerOptionDescription
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;
153 self::INPUT_KEY_MODE,
154 InputArgument::OPTIONAL,
155 $modeOptionDescription
167 private function validate(InputInterface $input): array
170 $inputIndexer = (string)$input->getArgument(self::INPUT_KEY_INDEXER);
172 $acceptedValues = array_keys($this->dimensionProviders);
173 $errors = $this->validateArgument(self::INPUT_KEY_INDEXER, $inputIndexer, $acceptedValues);
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);
194 private function validateArgument(
string $inputKey,
string $inputIndexer, array $acceptedValues): array
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;
elseif(isset( $params[ 'redirect_parent']))
const DIMENSION_MODE_NONE
const XML_PATH_DIMENSIONS_MODE_MASK
__construct(ObjectManagerFactory $objectManagerFactory, ScopeConfigInterface $configReader, array $dimensionSwitchers)