Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ModeSwitcher.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
15 
20 {
26  private $tableMaintainer;
27 
33  private $dimensionCollectionFactory;
34 
38  private $dimensionsArray;
39 
43  private $dimensionModeConfiguration;
44 
48  private $modeSwitcherConfiguration;
49 
56  public function __construct(
57  TableMaintainer $tableMaintainer,
58  DimensionCollectionFactory $dimensionCollectionFactory,
59  DimensionModeConfiguration $dimensionModeConfiguration,
60  ModeSwitcherConfiguration $modeSwitcherConfiguration
61  ) {
62  $this->tableMaintainer = $tableMaintainer;
63  $this->dimensionCollectionFactory = $dimensionCollectionFactory;
64  $this->dimensionModeConfiguration = $dimensionModeConfiguration;
65  $this->modeSwitcherConfiguration = $modeSwitcherConfiguration;
66  }
67 
71  public function getDimensionModes(): DimensionModes
72  {
73  $dimensionsList = [];
74  foreach ($this->dimensionModeConfiguration->getDimensionModes() as $dimension => $modes) {
75  $dimensionsList[] = new DimensionMode($dimension, $modes);
76  }
77 
78  return new DimensionModes($dimensionsList);
79  }
80 
84  public function switchMode(string $currentMode, string $previousMode)
85  {
86  //Create new tables and move data
87  $this->createTables($currentMode);
88  $this->moveData($currentMode, $previousMode);
89 
90  //Change config options
91  $this->modeSwitcherConfiguration->saveMode($currentMode);
92 
93  //Delete old tables
94  $this->dropTables($previousMode);
95  }
96 
105  public function createTables(string $currentMode)
106  {
107  foreach ($this->getDimensionsArray($currentMode) as $dimensions) {
108  if (!empty($dimensions)) {
109  $this->tableMaintainer->createTablesForDimensions($dimensions);
110  }
111  }
112  }
113 
122  public function moveData(string $currentMode, string $previousMode)
123  {
124  $dimensionsArrayForCurrentMode = $this->getDimensionsArray($currentMode);
125  $dimensionsArrayForPreviousMode = $this->getDimensionsArray($previousMode);
126 
127  foreach ($dimensionsArrayForCurrentMode as $dimensionsForCurrentMode) {
128  $newTable = $this->tableMaintainer->getMainTable($dimensionsForCurrentMode);
129  if (empty($dimensionsForCurrentMode)) {
130  // new mode is 'none'
131  foreach ($dimensionsArrayForPreviousMode as $dimensionsForPreviousMode) {
132  $oldTable = $this->tableMaintainer->getMainTable($dimensionsForPreviousMode);
133  $this->insertFromOldTablesToNew($newTable, $oldTable);
134  }
135  } else {
136  // new mode is not 'none'
137  foreach ($dimensionsArrayForPreviousMode as $dimensionsForPreviousMode) {
138  $oldTable = $this->tableMaintainer->getMainTable($dimensionsForPreviousMode);
139  $this->insertFromOldTablesToNew($newTable, $oldTable, $dimensionsForCurrentMode);
140  }
141  }
142  }
143  }
144 
152  public function dropTables(string $previousMode)
153  {
154  foreach ($this->getDimensionsArray($previousMode) as $dimensions) {
155  if (empty($dimensions)) {
156  $this->tableMaintainer->truncateTablesForDimensions($dimensions);
157  } else {
158  $this->tableMaintainer->dropTablesForDimensions($dimensions);
159  }
160  }
161  }
162 
170  private function getDimensionsArray(string $mode): \Magento\Framework\Indexer\MultiDimensionProvider
171  {
172  if (isset($this->dimensionsArray[$mode])) {
173  return $this->dimensionsArray[$mode];
174  }
175 
176  $this->dimensionsArray[$mode] = $this->dimensionCollectionFactory->create($mode);
177 
178  return $this->dimensionsArray[$mode];
179  }
180 
190  private function insertFromOldTablesToNew(string $newTable, string $oldTable, array $dimensions = [])
191  {
192  $select = $this->tableMaintainer->getConnection()->select()->from($oldTable);
193 
194  foreach ($dimensions as $dimension) {
195  if ($dimension->getName() === WebsiteDimensionProvider::DIMENSION_NAME) {
196  $select->where('website_id = ?', $dimension->getValue());
197  }
198  if ($dimension->getName() === CustomerGroupDimensionProvider::DIMENSION_NAME) {
199  $select->where('customer_group_id = ?', $dimension->getValue());
200  }
201  }
202  $this->tableMaintainer->getConnection()->query(
203  $this->tableMaintainer->getConnection()->insertFromSelect(
204  $select,
205  $newTable,
206  [],
207  \Magento\Framework\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE
208  )
209  );
210  }
211 }
__construct(TableMaintainer $tableMaintainer, DimensionCollectionFactory $dimensionCollectionFactory, DimensionModeConfiguration $dimensionModeConfiguration, ModeSwitcherConfiguration $modeSwitcherConfiguration)
moveData(string $currentMode, string $previousMode)
switchMode(string $currentMode, string $previousMode)
if($exist=($block->getProductCollection() && $block->getProductCollection() ->getSize())) $mode
Definition: grid.phtml:15