<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Cms\Model;
use Magento\Cms\Api\BlockRepositoryInterface;
use Magento\Cms\Api\Data;
use Magento\Cms\Model\ResourceModel\Block as ResourceBlock;
use Magento\Cms\Model\ResourceModel\Block\CollectionFactory as BlockCollectionFactory;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\CouldNotDeleteException;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Reflection\DataObjectProcessor;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\EntityManager\HydratorInterface;
/**
* Default block repo impl.
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class BlockRepository implements BlockRepositoryInterface
{
/**
* @var ResourceBlock
*/
protected $resource;
/**
* @var BlockFactory
*/
protected $blockFactory;
/**
* @var BlockCollectionFactory
*/
protected $blockCollectionFactory;
/**
* @var Data\BlockSearchResultsInterfaceFactory
*/
protected $searchResultsFactory;
/**
* @var DataObjectHelper
*/
protected $dataObjectHelper;
/**
* @var DataObjectProcessor
*/
protected $dataObjectProcessor;
/**
* @var \Magento\Cms\Api\Data\BlockInterfaceFactory
*/
protected $dataBlockFactory;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
private $storeManager;
/**
* @var CollectionProcessorInterface
*/
private $collectionProcessor;
/**
* @var HydratorInterface
*/
private $hydrator;
/**
* @param ResourceBlock $resource
* @param BlockFactory $blockFactory
* @param Data\BlockInterfaceFactory $dataBlockFactory
* @param BlockCollectionFactory $blockCollectionFactory
* @param Data\BlockSearchResultsInterfaceFactory $searchResultsFactory
* @param DataObjectHelper $dataObjectHelper
* @param DataObjectProcessor $dataObjectProcessor
* @param StoreManagerInterface $storeManager
* @param CollectionProcessorInterface $collectionProcessor
* @param HydratorInterface|null $hydrator
*
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
ResourceBlock $resource,
BlockFactory $blockFactory,
\Magento\Cms\Api\Data\BlockInterfaceFactory $dataBlockFactory,
BlockCollectionFactory $blockCollectionFactory,
Data\BlockSearchResultsInterfaceFactory $searchResultsFactory,
DataObjectHelper $dataObjectHelper,
DataObjectProcessor $dataObjectProcessor,
StoreManagerInterface $storeManager,
CollectionProcessorInterface $collectionProcessor = null,
?HydratorInterface $hydrator = null
) {
$this->resource = $resource;
$this->blockFactory = $blockFactory;
$this->blockCollectionFactory = $blockCollectionFactory;
$this->searchResultsFactory = $searchResultsFactory;
$this->dataObjectHelper = $dataObjectHelper;
$this->dataBlockFactory = $dataBlockFactory;
$this->dataObjectProcessor = $dataObjectProcessor;
$this->storeManager = $storeManager;
$this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
$this->hydrator = $hydrator ?? ObjectManager::getInstance()->get(HydratorInterface::class);
}
/**
* Save Block data
*
* @param \Magento\Cms\Api\Data\BlockInterface $block
* @return Block
* @throws CouldNotSaveException
*/
public function save(Data\BlockInterface $block)
{
if (empty($block->getStoreId())) {
$block->setStoreId($this->storeManager->getStore()->getId());
}
if ($block->getId() && $block instanceof Block && !$block->getOrigData()) {
$block = $this->hydrator->hydrate($this->getById($block->getId()), $this->hydrator->extract($block));
}
try {
$this->resource->save($block);
} catch (\Exception $exception) {
throw new CouldNotSaveException(__($exception->getMessage()));
}
return $block;
}
/**
* Load Block data by given Block Identity
*
* @param string $blockId
* @return Block
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getById($blockId)
{
$block = $this->blockFactory->create();
$this->resource->load($block, $blockId);
if (!$block->getId()) {
throw new NoSuchEntityException(__('The CMS block with the "%1" ID doesn\'t exist.', $blockId));
}
return $block;
}
/**
* Load Block data collection by given search criteria
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @param \Magento\Framework\Api\SearchCriteriaInterface $criteria
* @return \Magento\Cms\Api\Data\BlockSearchResultsInterface
*/
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $criteria)
{
/** @var \Magento\Cms\Model\ResourceModel\Block\Collection $collection */
$collection = $this->blockCollectionFactory->create();
$this->collectionProcessor->process($criteria, $collection);
/** @var Data\BlockSearchResultsInterface $searchResults */
$searchResults = $this->searchResultsFactory->create();
$searchResults->setSearchCriteria($criteria);
$searchResults->setItems($collection->getItems());
$searchResults->setTotalCount($collection->getSize());
return $searchResults;
}
/**
* Delete Block
*
* @param \Magento\Cms\Api\Data\BlockInterface $block
* @return bool
* @throws CouldNotDeleteException
*/
public function delete(Data\BlockInterface $block)
{
try {
$this->resource->delete($block);
} catch (\Exception $exception) {
throw new CouldNotDeleteException(__($exception->getMessage()));
}
return true;
}
/**
* Delete Block by given Block Identity
*
* @param string $blockId
* @return bool
* @throws CouldNotDeleteException
* @throws NoSuchEntityException
*/
public function deleteById($blockId)
{
return $this->delete($this->getById($blockId));
}
/**
* Retrieve collection processor
*
* @deprecated 102.0.0
* @return CollectionProcessorInterface
*/
private function getCollectionProcessor()
{
//phpcs:disable Magento2.PHP.LiteralNamespaces
if (!$this->collectionProcessor) {
$this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
'Magento\Cms\Model\Api\SearchCriteria\BlockCollectionProcessor'
);
}
return $this->collectionProcessor;
}
}
|