getEvent()->getObject() in this case * * @var string */ protected $_eventObject = 'blog_category'; /** * @var \Magento\Framework\UrlInterface */ protected $_url; /** * @var \Magefan\Blog\Model\ResourceModel\Post\CollectionFactory */ protected $postCollectionFactory; /** * @var array */ static private $loadedCategoriesRepository = []; /** * @var string */ protected $controllerName; /** * Initialize dependencies. * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magefan\Blog\Model\Url $url * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data */ public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, Url $url, \Magefan\Blog\Model\ResourceModel\Post\CollectionFactory $postCollectionFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { $this->_url = $url; $this->postCollectionFactory = $postCollectionFactory; parent::__construct($context, $registry, $resource, $resourceCollection, $data); } /** * Initialize resource model * * @return void */ protected function _construct() { $this->_init('Magefan\Blog\Model\ResourceModel\Category'); $this->controllerName = URL::CONTROLLER_CATEGORY; } /** * Load object data * * @param integer $modelId * @param null|string $field * @return $this * @deprecated */ public function load($modelId, $field = null) { $object = parent::load($modelId, $field); if (!isset(self::$loadedCategoriesRepository[$object->getId()])) { self::$loadedCategoriesRepository[$object->getId()] = $object; } return $object; } private function loadFromRepository($categoryId) { if (!isset(self::$loadedCategoriesRepository[$categoryId])) { $category = clone $this; $category->load($categoryId); } return self::$loadedCategoriesRepository[$categoryId]; } /** * Retrieve controller name * @return string */ public function getControllerName() { return $this->controllerName; } /** * Retrieve model title * @param boolean $plural * @return string */ public function getOwnTitle($plural = false) { return $plural ? 'Categories' : 'Category'; } /** * Retrieve true if category is active * @return boolean [description] */ public function isActive() { return ($this->getStatus() == self::STATUS_ENABLED); } /** * Retrieve available category statuses * @return array */ public function getAvailableStatuses() { return [self::STATUS_DISABLED => __('Disabled'), self::STATUS_ENABLED => __('Enabled')]; } /** * Check if category identifier exist for specific store * return category id if category exists * * @param string $identifier * @param int $storeId * @return int */ public function checkIdentifier($identifier, $storeId) { return $this->_getResource()->checkIdentifier($identifier, $storeId); } /** * Retrieve parent category ids * @return array */ public function getParentIds() { $k = 'parent_ids'; if (!$this->hasData($k)) { $this->setData($k, $this->getPath() ? explode('/', $this->getPath()) : [] ); } return $this->getData($k); } /** * Retrieve parent category id * @return array */ public function getParentId() { $parentIds = $this->getParentIds(); if ($parentIds) { return $parentIds[count($parentIds) - 1]; } return 0; } /** * Retrieve parent category * @return self || false */ public function getParentCategory() { $k = 'parent_category'; if (null === $this->getData($k)) { $this->setData($k, false); if ($pId = $this->getParentId()) { $category = $this->loadFromRepository($pId); if ($category->getId()) { if ($category->isVisibleOnStore($this->getStoreId())) { $this->setData($k, $category); } } } } return $this->getData($k); } /** * Check if current category is parent category * @param self $category * @return boolean */ public function isParent($category) { if (is_object($category)) { $category = $category->getId(); } return in_array($category, $this->getParentIds()); } /** * Retrieve children category ids * @return array */ public function getChildrenIds() { $k = 'children_ids'; if (!$this->hasData($k)) { $categories = \Magento\Framework\App\ObjectManager::getInstance() ->create($this->_collectionName); $ids = []; foreach($categories as $category) { if ($category->isParent($this)) { $ids[] = $category->getId(); } } $this->setData($k, $ids ); } return $this->getData($k); } /** * Check if current category is child category * @param self $category * @return boolean */ public function isChild($category) { return $category->isParent($this); } /** * Retrieve category depth level * @return int */ public function getLevel() { return count($this->getParentIds()); } /** * Retrieve catgegory url route path * @return string */ public function getUrl() { return $this->_url->getUrlPath($this->getIdentifier(), $this->controllerName); } /** * Retrieve category url * @return string */ public function getCategoryUrl() { return $this->_url->getUrl($this, $this->controllerName); } /** * Retrieve catgegory canonical url * @return string */ public function getCanonicalUrl() { return $this->_url->getCanonicalUrl($this); } /** * Retrieve meta title * @return string */ public function getMetaTitle() { $title = $this->getData('meta_title'); if (!$title) { $title = $this->getData('title'); } return trim($title); } /** * Retrieve meta description * @return string */ public function getMetaDescription() { $desc = $this->getData('meta_description'); if (!$desc) { $desc = $this->getData('content'); } $desc = strip_tags($desc); if (mb_strlen($desc) > 160) { $desc = mb_substr($desc, 0, 160); } return trim($desc); } /** * Retrieve if is visible on store * @return bool */ public function isVisibleOnStore($storeId) { return $this->getIsActive() && array_intersect([0, $storeId], $this->getStoreIds()); } /** * Retrieve number of posts in this category * * @return int */ public function getPostsCount() { $key = 'posts_count'; if (!$this->hasData($key)) { $posts = $this->postCollectionFactory->create() ->addActiveFilter() ->addStoreFilter($this->getStoreId()) ->addCategoryFilter($this); $this->setData($key, (int)$posts->getSize()); } return $this->getData($key); } /** * Prepare all additional data * @param string $format * @return self */ public function initDinamicData() { $keys = [ 'meta_description', 'meta_title', ]; foreach ($keys as $key) { $method = 'get' . str_replace('_', '', ucwords($key, '_') ); $this->$method(); } return $this; } /** * Duplicate category and return new object * @return self */ public function duplicate() { $object = clone $this; $object ->unsetData('category_id') ->setTitle($object->getTitle() . ' (' . __('Duplicated') . ')') ->setData('is_active', 0); return $object->save(); } }