Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Page.php
Go to the documentation of this file.
1 <?php
8 
21 
26 class Page extends AbstractDb
27 {
33  protected $_store = null;
34 
40  protected $_storeManager;
41 
45  protected $dateTime;
46 
50  protected $entityManager;
51 
55  protected $metadataPool;
56 
65  public function __construct(
66  Context $context,
71  $connectionName = null
72  ) {
73  parent::__construct($context, $connectionName);
74  $this->_storeManager = $storeManager;
75  $this->dateTime = $dateTime;
76  $this->entityManager = $entityManager;
77  $this->metadataPool = $metadataPool;
78  }
79 
85  protected function _construct()
86  {
87  $this->_init('cms_page', 'page_id');
88  }
89 
93  public function getConnection()
94  {
95  return $this->metadataPool->getMetadata(PageInterface::class)->getEntityConnection();
96  }
97 
105  protected function _beforeSave(AbstractModel $object)
106  {
107  /*
108  * For two attributes which represent timestamp data in DB
109  * we should make converting such as:
110  * If they are empty we need to convert them into DB
111  * type NULL so in DB they will be empty and not some default value
112  */
113  foreach (['custom_theme_from', 'custom_theme_to'] as $field) {
114  $value = !$object->getData($field) ? null : $this->dateTime->formatDate($object->getData($field));
115  $object->setData($field, $value);
116  }
117 
118  if (!$this->isValidPageIdentifier($object)) {
119  throw new LocalizedException(
120  __(
121  "The page URL key can't use capital letters or disallowed symbols. "
122  . "Remove the letters and symbols and try again."
123  )
124  );
125  }
126 
127  if ($this->isNumericPageIdentifier($object)) {
128  throw new LocalizedException(
129  __("The page URL key can't use only numbers. Add letters or words and try again.")
130  );
131  }
132  return parent::_beforeSave($object);
133  }
134 
143  private function getPageId(AbstractModel $object, $value, $field = null)
144  {
145  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
146 
147  if (!is_numeric($value) && $field === null) {
148  $field = 'identifier';
149  } elseif (!$field) {
150  $field = $entityMetadata->getIdentifierField();
151  }
152 
153  $pageId = $value;
154  if ($field != $entityMetadata->getIdentifierField() || $object->getStoreId()) {
155  $select = $this->_getLoadSelect($field, $value, $object);
156  $select->reset(Select::COLUMNS)
157  ->columns($this->getMainTable() . '.' . $entityMetadata->getIdentifierField())
158  ->limit(1);
159  $result = $this->getConnection()->fetchCol($select);
160  $pageId = count($result) ? $result[0] : false;
161  }
162  return $pageId;
163  }
164 
173  public function load(AbstractModel $object, $value, $field = null)
174  {
175  $pageId = $this->getPageId($object, $value, $field);
176  if ($pageId) {
177  $this->entityManager->load($object, $pageId);
178  }
179  return $this;
180  }
181 
190  protected function _getLoadSelect($field, $value, $object)
191  {
192  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
193  $linkField = $entityMetadata->getLinkField();
194 
195  $select = parent::_getLoadSelect($field, $value, $object);
196 
197  if ($object->getStoreId()) {
198  $storeIds = [
200  (int)$object->getStoreId(),
201  ];
202  $select->join(
203  ['cms_page_store' => $this->getTable('cms_page_store')],
204  $this->getMainTable() . '.' . $linkField . ' = cms_page_store.' . $linkField,
205  []
206  )
207  ->where('is_active = ?', 1)
208  ->where('cms_page_store.store_id IN (?)', $storeIds)
209  ->order('cms_page_store.store_id DESC')
210  ->limit(1);
211  }
212 
213  return $select;
214  }
215 
224  protected function _getLoadByIdentifierSelect($identifier, $store, $isActive = null)
225  {
226  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
227  $linkField = $entityMetadata->getLinkField();
228 
229  $select = $this->getConnection()->select()
230  ->from(['cp' => $this->getMainTable()])
231  ->join(
232  ['cps' => $this->getTable('cms_page_store')],
233  'cp.' . $linkField . ' = cps.' . $linkField,
234  []
235  )
236  ->where('cp.identifier = ?', $identifier)
237  ->where('cps.store_id IN (?)', $store);
238 
239  if ($isActive !== null) {
240  $select->where('cp.is_active = ?', $isActive);
241  }
242 
243  return $select;
244  }
245 
252  protected function isNumericPageIdentifier(AbstractModel $object)
253  {
254  return preg_match('/^[0-9]+$/', $object->getData('identifier'));
255  }
256 
263  protected function isValidPageIdentifier(AbstractModel $object)
264  {
265  return preg_match('/^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/', $object->getData('identifier'));
266  }
267 
276  public function checkIdentifier($identifier, $storeId)
277  {
278  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
279 
281  $select = $this->_getLoadByIdentifierSelect($identifier, $stores, 1);
282  $select->reset(Select::COLUMNS)
283  ->columns('cp.' . $entityMetadata->getIdentifierField())
284  ->order('cps.store_id DESC')
285  ->limit(1);
286 
287  return $this->getConnection()->fetchOne($select);
288  }
289 
296  public function getCmsPageTitleByIdentifier($identifier)
297  {
299  if ($this->_store) {
300  $stores[] = (int)$this->getStore()->getId();
301  }
302 
303  $select = $this->_getLoadByIdentifierSelect($identifier, $stores);
304  $select->reset(Select::COLUMNS)
305  ->columns('cp.title')
306  ->order('cps.store_id DESC')
307  ->limit(1);
308 
309  return $this->getConnection()->fetchOne($select);
310  }
311 
318  public function getCmsPageTitleById($id)
319  {
320  $connection = $this->getConnection();
321  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
322 
323  $select = $connection->select()
324  ->from($this->getMainTable(), 'title')
325  ->where($entityMetadata->getIdentifierField() . ' = :page_id');
326 
327  return $connection->fetchOne($select, ['page_id' => (int)$id]);
328  }
329 
336  public function getCmsPageIdentifierById($id)
337  {
338  $connection = $this->getConnection();
339  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
340 
341  $select = $connection->select()
342  ->from($this->getMainTable(), 'identifier')
343  ->where($entityMetadata->getIdentifierField() . ' = :page_id');
344 
345  return $connection->fetchOne($select, ['page_id' => (int)$id]);
346  }
347 
354  public function lookupStoreIds($pageId)
355  {
356  $connection = $this->getConnection();
357 
358  $entityMetadata = $this->metadataPool->getMetadata(PageInterface::class);
359  $linkField = $entityMetadata->getLinkField();
360 
361  $select = $connection->select()
362  ->from(['cps' => $this->getTable('cms_page_store')], 'store_id')
363  ->join(
364  ['cp' => $this->getMainTable()],
365  'cps.' . $linkField . ' = cp.' . $linkField,
366  []
367  )
368  ->where('cp.' . $entityMetadata->getIdentifierField() . ' = :page_id');
369 
370  return $connection->fetchCol($select, ['page_id' => (int)$pageId]);
371  }
372 
379  public function setStore($store)
380  {
381  $this->_store = $store;
382  return $this;
383  }
384 
390  public function getStore()
391  {
392  return $this->_storeManager->getStore($this->_store);
393  }
394 
398  public function save(AbstractModel $object)
399  {
400  $this->entityManager->save($object);
401  return $this;
402  }
403 
407  public function delete(AbstractModel $object)
408  {
409  $this->entityManager->delete($object);
410  return $this;
411  }
412 }
isValidPageIdentifier(AbstractModel $object)
Definition: Page.php:263
getData($key='', $index=null)
Definition: DataObject.php:119
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
_beforeSave(AbstractModel $object)
Definition: Page.php:105
$id
Definition: fieldset.phtml:14
$storeManager
__()
Definition: __.php:13
isNumericPageIdentifier(AbstractModel $object)
Definition: Page.php:252
load(AbstractModel $object, $value, $field=null)
Definition: Page.php:173
checkIdentifier($identifier, $storeId)
Definition: Page.php:276
$value
Definition: gender.phtml:16
__construct(Context $context, StoreManagerInterface $storeManager, DateTime $dateTime, EntityManager $entityManager, MetadataPool $metadataPool, $connectionName=null)
Definition: Page.php:65
const COLUMNS
Definition: Select.php:48
_getLoadSelect($field, $value, $object)
Definition: Page.php:190
getCmsPageTitleByIdentifier($identifier)
Definition: Page.php:296
$connection
Definition: bulk.php:13
save(AbstractModel $object)
Definition: Page.php:398
_getLoadByIdentifierSelect($identifier, $store, $isActive=null)
Definition: Page.php:224