Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Instance.php
Go to the documentation of this file.
1 <?php
8 
10 
18 {
24  protected function _construct()
25  {
26  $this->_init('widget_instance', 'instance_id');
27  }
28 
35  protected function _afterLoad(AbstractModel $object)
36  {
37  $connection = $this->getConnection();
38  $select = $connection->select()->from(
39  $this->getTable('widget_instance_page')
40  )->where(
41  'instance_id = ?',
42  (int)$object->getId()
43  );
44  $result = $connection->fetchAll($select);
45  $object->setData('page_groups', $result);
46  return parent::_afterLoad($object);
47  }
48 
55  protected function _afterSave(AbstractModel $object)
56  {
57  $pageTable = $this->getTable('widget_instance_page');
58  $pageLayoutTable = $this->getTable('widget_instance_page_layout');
59  $connection = $this->getConnection();
60 
61  $select = $connection->select()->from($pageTable, 'page_id')->where('instance_id = ?', (int)$object->getId());
62  $pageIds = $connection->fetchCol($select);
63 
64  $removePageIds = array_diff($pageIds, $object->getData('page_group_ids'));
65 
66  if (is_array($pageIds) && count($pageIds) > 0) {
67  $inCond = $connection->prepareSqlCondition('page_id', ['in' => $pageIds]);
68 
69  $select = $connection->select()->from($pageLayoutTable, 'layout_update_id')->where($inCond);
70  $removeLayoutUpdateIds = $connection->fetchCol($select);
71 
72  $connection->delete($pageLayoutTable, $inCond);
73  $this->_deleteLayoutUpdates($removeLayoutUpdateIds);
74  }
75 
76  $this->_deleteWidgetInstancePages($removePageIds);
77 
78  foreach ($object->getData('page_groups') as $pageGroup) {
79  $pageLayoutUpdateIds = $this->_saveLayoutUpdates($object, $pageGroup);
80  $data = [
81  'page_group' => $pageGroup['group'],
82  'layout_handle' => $pageGroup['layout_handle'],
83  'block_reference' => $pageGroup['block_reference'],
84  'page_for' => $pageGroup['for'],
85  'entities' => $pageGroup['entities'],
86  'page_template' => $pageGroup['template'],
87  ];
88  $pageId = $pageGroup['page_id'];
89  if (in_array($pageGroup['page_id'], $pageIds)) {
90  $connection->update($pageTable, $data, ['page_id = ?' => (int)$pageId]);
91  } else {
92  $connection->insert($pageTable, array_merge(['instance_id' => $object->getId()], $data));
93  $pageId = $connection->lastInsertId($pageTable);
94  }
95  foreach ($pageLayoutUpdateIds as $layoutUpdateId) {
96  $connection->insert(
97  $pageLayoutTable,
98  ['page_id' => $pageId, 'layout_update_id' => $layoutUpdateId]
99  );
100  }
101  }
102 
103  return parent::_afterSave($object);
104  }
105 
113  protected function _saveLayoutUpdates($widgetInstance, $pageGroupData)
114  {
115  $connection = $this->getConnection();
116  $pageLayoutUpdateIds = [];
117  $storeIds = $this->_prepareStoreIds($widgetInstance->getStoreIds());
118  $layoutUpdateTable = $this->getTable('layout_update');
119  $layoutUpdateLinkTable = $this->getTable('layout_link');
120 
121  foreach ($pageGroupData['layout_handle_updates'] as $handle) {
122  $xml = $widgetInstance->generateLayoutUpdateXml(
123  $pageGroupData['block_reference'],
124  $pageGroupData['template']
125  );
126  $insert = ['handle' => $handle, 'xml' => $xml];
127  if (strlen($widgetInstance->getSortOrder())) {
128  $insert['sort_order'] = $widgetInstance->getSortOrder();
129  }
130 
131  $connection->insert($layoutUpdateTable, $insert);
132  $layoutUpdateId = $connection->lastInsertId($layoutUpdateTable);
133  $pageLayoutUpdateIds[] = $layoutUpdateId;
134 
135  $data = [];
136  foreach ($storeIds as $storeId) {
137  $data[] = [
138  'store_id' => $storeId,
139  'theme_id' => $widgetInstance->getThemeId(),
140  'layout_update_id' => $layoutUpdateId,
141  ];
142  }
143  $connection->insertMultiple($layoutUpdateLinkTable, $data);
144  }
145  return $pageLayoutUpdateIds;
146  }
147 
155  protected function _prepareStoreIds($storeIds)
156  {
157  if (in_array('0', $storeIds)) {
158  $storeIds = [0];
159  }
160  return $storeIds;
161  }
162 
170  protected function _beforeDelete(AbstractModel $object)
171  {
172  $connection = $this->getConnection();
173  $select = $connection->select()->from(
174  ['main_table' => $this->getTable('widget_instance_page')],
175  []
176  )->joinInner(
177  ['layout_page_table' => $this->getTable('widget_instance_page_layout')],
178  'layout_page_table.page_id = main_table.page_id',
179  ['layout_update_id']
180  )->where(
181  'main_table.instance_id=?',
182  $object->getId()
183  );
184  $result = $connection->fetchCol($select);
185  $object->setLayoutUpdateIdsToDelete($result);
186  return $this;
187  }
188 
196  protected function _afterDelete(AbstractModel $object)
197  {
198  $this->_deleteLayoutUpdates($object->getLayoutUpdateIdsToDelete());
199  return parent::_afterDelete($object);
200  }
201 
208  protected function _deleteWidgetInstancePages($pageIds)
209  {
210  $connection = $this->getConnection();
211  if ($pageIds) {
212  $inCond = $connection->prepareSqlCondition('page_id', ['in' => $pageIds]);
213  $connection->delete($this->getTable('widget_instance_page'), $inCond);
214  }
215  return $this;
216  }
217 
224  protected function _deleteLayoutUpdates($layoutUpdateIds)
225  {
226  $connection = $this->getConnection();
227  if ($layoutUpdateIds) {
228  $inCond = $connection->prepareSqlCondition('layout_update_id', ['in' => $layoutUpdateIds]);
229  $connection->delete($this->getTable('layout_update'), $inCond);
230  }
231  return $this;
232  }
233 
240  public function lookupStoreIds($id)
241  {
242  $connection = $this->getConnection();
243  $select = $connection->select()->from(
244  $this->getMainTable(),
245  'store_ids'
246  )->where(
247  "{$this->getIdFieldName()} = ?",
248  (int)$id
249  );
250  $storeIds = $connection->fetchOne($select);
251  return $storeIds ? explode(',', $storeIds) : [];
252  }
253 }
getData($key='', $index=null)
Definition: DataObject.php:119
$id
Definition: fieldset.phtml:14
_saveLayoutUpdates($widgetInstance, $pageGroupData)
Definition: Instance.php:113
$connection
Definition: bulk.php:13
$handle