123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- <?php
- /**
- * Copyright © 2016 Ihor Vansach (ihor@magefan.com). All rights reserved.
- * See LICENSE.txt for license details (http://opensource.org/licenses/osl-3.0.php).
- *
- * Glory to Ukraine! Glory to the heroes!
- */
- namespace Magefan\Blog\Model\ResourceModel;
- /**
- * Blog category resource model
- */
- class Post extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
- {
- /**
- * @var \Magento\Framework\Stdlib\DateTime\DateTime
- */
- protected $_date;
- /**
- * @var \Magento\Framework\Stdlib\DateTime
- */
- protected $dateTime;
- /**
- * Construct
- *
- * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
- * @param \Magento\Framework\Stdlib\DateTime\DateTime $date
- * @param \Magento\Framework\Stdlib\DateTime $dateTime
- * @param string|null $resourcePrefix
- */
- public function __construct(
- \Magento\Framework\Model\ResourceModel\Db\Context $context,
- \Magento\Framework\Stdlib\DateTime\DateTime $date,
- \Magento\Framework\Stdlib\DateTime $dateTime,
- $resourcePrefix = null
- ) {
- parent::__construct($context, $resourcePrefix);
- $this->_date = $date;
- $this->dateTime = $dateTime;
- }
- /**
- * Initialize resource model
- * Get tablename from config
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init('magefan_blog_post', 'post_id');
- }
- /**
- * Retrieve date object
- * @return \Magento\Framework\Stdlib\DateTime
- */
- public function getDate()
- {
- return $this->_date;
- }
- /**
- * Process post data before deleting
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return $this
- */
- protected function _beforeDelete(
- \Magento\Framework\Model\AbstractModel $object
- ){
- $condition = ['post_id = ?' => (int)$object->getId()];
- $tableSufixs = [
- 'store',
- 'category',
- 'tag',
- 'relatedproduct',
- 'relatedpost',
- 'relatedpost',
- ];
- foreach ($tableSufixs as $sufix) {
- $this->getConnection()->delete(
- $this->getTable('magefan_blog_post_' . $sufix),
- ($sufix == 'relatedpost')
- ? ['related_id = ?' => (int)$object->getId()]
- : $condition
- );
- }
- return parent::_beforeDelete($object);
- }
- /**
- * Process post data before saving
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return $this
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object)
- {
- foreach (['publish_time', 'custom_theme_from', 'custom_theme_to'] as $field) {
- $value = $object->getData($field) ?: null;
- $object->setData($field, $this->dateTime->formatDate($value));
- }
- $identifierGenerator = \Magento\Framework\App\ObjectManager::getInstance()
- ->create('Magefan\Blog\Model\ResourceModel\PageIdentifierGenerator');
- $identifierGenerator->generate($object);
- if (!$this->isValidPageIdentifier($object)) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The post URL key contains capital letters or disallowed symbols.')
- );
- }
- if ($this->isNumericPageIdentifier($object)) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The post URL key cannot be made of only numbers.')
- );
- }
- $gmtDate = $this->_date->gmtDate();
- if ($object->isObjectNew() && !$object->getCreationTime()) {
- $object->setCreationTime($gmtDate);
- }
- if (!$object->getPublishTime()) {
- $object->setPublishTime($object->getCreationTime());
- }
- $object->setUpdateTime($gmtDate);
- return parent::_beforeSave($object);
- }
- /**
- * Assign post to store views, categories, related posts, etc.
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return $this
- */
- protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
- {
- $oldIds = $this->lookupStoreIds($object->getId());
- $newIds = (array)$object->getStoreIds();
- if (!$newIds) {
- $newIds = [0];
- }
- $this->_updateLinks($object, $newIds, $oldIds, 'magefan_blog_post_store', 'store_id');
- /* Save category & tag links */
- foreach (['category' => 'categories', 'tag' => 'tags'] as $linkType => $dataKey) {
- $newIds = (array)$object->getData($dataKey);
- foreach($newIds as $key => $id) {
- if (!$id) { // e.g.: zero
- unset($newIds[$key]);
- }
- }
- if (is_array($newIds)) {
- $lookup = 'lookup' . ucfirst($linkType) . 'Ids';
- $oldIds = $this->$lookup($object->getId());
- $this->_updateLinks(
- $object,
- $newIds,
- $oldIds,
- 'magefan_blog_post_' . $linkType,
- $linkType . '_id'
- );
- }
- }
- /* Save tags links */
- $newIds = (array)$object->getTags();
- foreach($newIds as $key => $id) {
- if (!$id) { // e.g.: zero
- unset($newIds[$key]);
- }
- }
- if (is_array($newIds)) {
- $oldIds = $this->lookupTagIds($object->getId());
- $this->_updateLinks($object, $newIds, $oldIds, 'magefan_blog_post_tag', 'tag_id');
- }
- /* Save related post & product links */
- if ($links = $object->getData('links')) {
- if (is_array($links)) {
- foreach (['post', 'product'] as $linkType) {
- if (isset($links[$linkType]) && is_array($links[$linkType])) {
- $linksData = $links[$linkType];
- $lookup = 'lookupRelated' . ucfirst($linkType) . 'Ids';
- $oldIds = $this->$lookup($object->getId());
- $this->_updateLinks(
- $object,
- array_keys($linksData),
- $oldIds,
- 'magefan_blog_post_related' . $linkType,
- 'related_id',
- $linksData
- );
- }
- }
- }
- }
- return parent::_afterSave($object);
- }
- /**
- * Update post connections
- * @param \Magento\Framework\Model\AbstractModel $object
- * @param Array $newRelatedIds
- * @param Array $oldRelatedIds
- * @param String $tableName
- * @param String $field
- * @param Array $rowData
- * @return void
- */
- protected function _updateLinks(
- \Magento\Framework\Model\AbstractModel $object,
- Array $newRelatedIds,
- Array $oldRelatedIds,
- $tableName,
- $field,
- $rowData = []
- ) {
- $table = $this->getTable($tableName);
- $insert = $newRelatedIds;
- $delete = $oldRelatedIds;
- if ($delete) {
- $where = ['post_id = ?' => (int)$object->getId(), $field.' IN (?)' => $delete];
- $this->getConnection()->delete($table, $where);
- }
- if ($insert) {
- $data = [];
- foreach ($insert as $id) {
- $id = (int)$id;
- $data[] = array_merge(['post_id' => (int)$object->getId(), $field => $id],
- (isset($rowData[$id]) && is_array($rowData[$id])) ? $rowData[$id] : []
- );
- }
- $this->getConnection()->insertMultiple($table, $data);
- }
- }
- /**
- * Load an object using 'identifier' field if there's no field specified and value is not numeric
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @param mixed $value
- * @param string $field
- * @return $this
- */
- public function load(\Magento\Framework\Model\AbstractModel $object, $value, $field = null)
- {
- if (!is_numeric($value) && is_null($field)) {
- $field = 'identifier';
- }
- return parent::load($object, $value, $field);
- }
- /**
- * Perform operations after object load
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return $this
- */
- protected function _afterLoad(\Magento\Framework\Model\AbstractModel $object)
- {
- if ($object->getId()) {
- $storeIds = $this->lookupStoreIds($object->getId());
- $object->setData('store_ids', $storeIds);
- $categories = $this->lookupCategoryIds($object->getId());
- $object->setCategories($categories);
- $tags = $this->lookupTagIds($object->getId());
- $object->setTags($tags);
- }
- return parent::_afterLoad($object);
- }
- /**
- * Check if post identifier exist for specific store
- * return post id if post exists
- *
- * @param string $identifier
- * @param int $storeId
- * @return int
- */
- protected function _getLoadByIdentifierSelect($identifier, $storeIds)
- {
- $select = $this->getConnection()->select()->from(
- ['cp' => $this->getMainTable()]
- )->join(
- ['cps' => $this->getTable('magefan_blog_post_store')],
- 'cp.post_id = cps.post_id',
- []
- )->where(
- 'cp.identifier = ?',
- $identifier
- )->where(
- 'cps.store_id IN (?)',
- $storeIds
- );
- return $select;
- }
- /**
- * Check whether post identifier is numeric
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return bool
- */
- protected function isNumericPageIdentifier(\Magento\Framework\Model\AbstractModel $object)
- {
- return preg_match('/^[0-9]+$/', $object->getData('identifier'));
- }
- /**
- * Check whether post identifier is valid
- *
- * @param \Magento\Framework\Model\AbstractModel $object
- * @return bool
- */
- protected function isValidPageIdentifier(\Magento\Framework\Model\AbstractModel $object)
- {
- return preg_match('/^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/', $object->getData('identifier'));
- }
- /**
- * Check if post identifier exist for specific store
- * return post id if post exists
- *
- * @param string $identifier
- * @param int|array $storeId
- * @return int
- */
- public function checkIdentifier($identifier, $storeIds)
- {
- if (!is_array($storeIds)) {
- $storeIds = [$storeIds];
- }
- $storeIds[] = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
- $select = $this->_getLoadByIdentifierSelect($identifier, $storeIds);
- $select->reset(\Zend_Db_Select::COLUMNS)->columns('cp.post_id')->order('cps.store_id DESC')->limit(1);
- return $this->getConnection()->fetchOne($select);
- }
- /**
- * Get store ids to which specified item is assigned
- *
- * @param int $postId
- * @return array
- */
- public function lookupStoreIds($postId)
- {
- return $this->_lookupIds($postId, 'magefan_blog_post_store', 'store_id');
- }
- /**
- * Get category ids to which specified item is assigned
- *
- * @param int $postId
- * @return array
- */
- public function lookupCategoryIds($postId)
- {
- return $this->_lookupIds($postId, 'magefan_blog_post_category', 'category_id');
- }
- /**
- * Get tag ids to which specified item is assigned
- *
- * @param int $postId
- * @return array
- */
- public function lookupTagIds($postId)
- {
- return $this->_lookupIds($postId, 'magefan_blog_post_tag', 'tag_id');
- }
- /**
- * Get related post ids to which specified item is assigned
- *
- * @param int $postId
- * @return array
- */
- public function lookupRelatedPostIds($postId)
- {
- return $this->_lookupIds($postId, 'magefan_blog_post_relatedpost', 'related_id');
- }
- /**
- * Get related product ids to which specified item is assigned
- *
- * @param int $postId
- * @return array
- */
- public function lookupRelatedProductIds($postId)
- {
- return $this->_lookupIds($postId, 'magefan_blog_post_relatedproduct', 'related_id');
- }
- /**
- * Get ids to which specified item is assigned
- * @param int $postId
- * @param string $tableName
- * @param string $field
- * @return array
- */
- protected function _lookupIds($postId, $tableName, $field)
- {
- $adapter = $this->getConnection();
- $select = $adapter->select()->from(
- $this->getTable($tableName),
- $field
- )->where(
- 'post_id = ?',
- (int)$postId
- );
- return $adapter->fetchCol($select);
- }
- }
|