Skip to content

Commit 6c3edb1

Browse files
author
Oleksii Korshenko
authored
Merge pull request #1789 from magento-engcom/develop-prs
Public Pull Requests #10925 10414 - Add ability to load block and pages by identifiers by @damiantomczak Fixed Public Issues #10414 [CMS] Add ability to load block and pages by identifiers
2 parents 79e788c + ad7df79 commit 6c3edb1

File tree

9 files changed

+429
-6
lines changed

9 files changed

+429
-6
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Api;
7+
8+
/**
9+
* Command to load the block data by specified identifier
10+
* @api
11+
*/
12+
interface GetBlockByIdentifierInterface
13+
{
14+
/**
15+
* Load block data by given block identifier.
16+
*
17+
* @param string $identifier
18+
* @param int $storeId
19+
* @throws \Magento\Framework\Exception\NoSuchEntityException
20+
* @return \Magento\Cms\Api\Data\BlockInterface
21+
*/
22+
public function execute(string $identifier, int $storeId) : \Magento\Cms\Api\Data\BlockInterface;
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Api;
7+
8+
/**
9+
* Command to load the page data by specified identifier
10+
* @api
11+
*/
12+
interface GetPageByIdentifierInterface
13+
{
14+
/**
15+
* Load page data by given page identifier.
16+
*
17+
* @param string $identifier
18+
* @param int $storeId
19+
* @throws \Magento\Framework\Exception\NoSuchEntityException
20+
* @return \Magento\Cms\Api\Data\PageInterface
21+
*/
22+
public function execute(string $identifier, int $storeId) : \Magento\Cms\Api\Data\PageInterface;
23+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Model;
7+
8+
use Magento\Cms\Api\GetBlockByIdentifierInterface;
9+
use Magento\Cms\Api\Data\BlockInterface;
10+
use Magento\Framework\Exception\NoSuchEntityException;
11+
12+
/**
13+
* Class GetBlockByIdentifier
14+
*/
15+
class GetBlockByIdentifier implements GetBlockByIdentifierInterface
16+
{
17+
/**
18+
* @var \Magento\Cms\Model\BlockFactory
19+
*/
20+
private $blockFactory;
21+
22+
/**
23+
* @var ResourceModel\Block
24+
*/
25+
private $blockResource;
26+
27+
/**
28+
* @param BlockFactory $blockFactory
29+
* @param ResourceModel\Block $blockResource
30+
*/
31+
public function __construct(
32+
\Magento\Cms\Model\BlockFactory $blockFactory,
33+
\Magento\Cms\Model\ResourceModel\Block $blockResource
34+
) {
35+
$this->blockFactory = $blockFactory;
36+
$this->blockResource = $blockResource;
37+
}
38+
39+
/**
40+
* @inheritdoc
41+
*/
42+
public function execute(string $identifier, int $storeId) : BlockInterface
43+
{
44+
$block = $this->blockFactory->create();
45+
$block->setStoreId($storeId);
46+
$this->blockResource->load($block, $identifier, BlockInterface::IDENTIFIER);
47+
48+
if (!$block->getId()) {
49+
throw new NoSuchEntityException(__('CMS Block with identifier "%1" does not exist.', $identifier));
50+
}
51+
52+
return $block;
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Model;
7+
8+
use Magento\Cms\Api\Data\PageInterface;
9+
use Magento\Cms\Api\GetPageByIdentifierInterface;
10+
use Magento\Framework\Exception\NoSuchEntityException;
11+
12+
/**
13+
* Class GetPageByIdentifier
14+
*/
15+
class GetPageByIdentifier implements GetPageByIdentifierInterface
16+
{
17+
/**
18+
* @var \Magento\Cms\Model\PageFactory
19+
*/
20+
private $pageFactory;
21+
22+
/**
23+
* @var ResourceModel\Page
24+
*/
25+
private $pageResource;
26+
27+
/**
28+
* @param PageFactory $pageFactory
29+
* @param ResourceModel\Page $pageResource
30+
*/
31+
public function __construct(
32+
\Magento\Cms\Model\PageFactory $pageFactory,
33+
\Magento\Cms\Model\ResourceModel\Page $pageResource
34+
) {
35+
$this->pageFactory = $pageFactory;
36+
$this->pageResource = $pageResource;
37+
}
38+
39+
/**
40+
* @inheritdoc
41+
*/
42+
public function execute(string $identifier, int $storeId) : PageInterface
43+
{
44+
$page = $this->pageFactory->create();
45+
$page->setStoreId($storeId);
46+
$this->pageResource->load($page, $identifier, PageInterface::IDENTIFIER);
47+
48+
if (!$page->getId()) {
49+
throw new NoSuchEntityException(__('CMS Page with identifier "%1" does not exist.', $identifier));
50+
}
51+
52+
return $page;
53+
}
54+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Test\Unit\Model;
7+
8+
use Magento\Cms\Model\GetBlockByIdentifier;
9+
10+
/**
11+
* Test for Magento\Cms\Model\GetBlockByIdentifier
12+
*/
13+
14+
class GetBlockByIdentifierTest extends \PHPUnit\Framework\TestCase
15+
{
16+
/**
17+
* @var GetBlockByIdentifier
18+
*/
19+
private $getBlockByIdentifierCommand;
20+
21+
/**
22+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Block
23+
*/
24+
private $block;
25+
26+
/**
27+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\BlockFactory
28+
*/
29+
private $blockFactory;
30+
31+
/**
32+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\ResourceModel\Block
33+
*/
34+
private $blockResource;
35+
36+
protected function setUp()
37+
{
38+
$this->blockFactory = $this->getMockBuilder(\Magento\Cms\Model\BlockFactory::class)
39+
->disableOriginalConstructor()
40+
->setMethods(['create'])
41+
->getMock();
42+
43+
$this->blockResource = $this->getMockBuilder(\Magento\Cms\Model\ResourceModel\Block::class)
44+
->disableOriginalConstructor()
45+
->getMock();
46+
47+
$this->block = $this->getMockBuilder(\Magento\Cms\Model\Block::class)
48+
->disableOriginalConstructor()
49+
->setMethods(['setStoreId', 'getId'])
50+
->getMock();
51+
52+
$this->getBlockByIdentifierCommand = new GetBlockByIdentifier($this->blockFactory, $this->blockResource);
53+
}
54+
55+
/**
56+
* Test for getByIdentifier method
57+
*/
58+
public function testGetByIdentifier()
59+
{
60+
$identifier = 'banner';
61+
$storeId = 0;
62+
63+
$this->blockFactory->expects($this->once())
64+
->method('create')
65+
->willReturn($this->block);
66+
67+
$this->block->expects($this->once())
68+
->method('setStoreId')
69+
->willReturn($this->block);
70+
71+
$this->block->expects($this->once())
72+
->method('getId')
73+
->willReturn(1);
74+
75+
$this->blockResource->expects($this->once())
76+
->method('load')
77+
->with($this->block, $identifier)
78+
->willReturn($this->block);
79+
80+
$this->getBlockByIdentifierCommand->execute($identifier, $storeId);
81+
}
82+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Test\Unit\Model;
7+
8+
use Magento\Cms\Model\GetPageByIdentifier;
9+
10+
/**
11+
* Test for Magento\Cms\Model\GetPageByIdentifier
12+
*/
13+
14+
class GetPageByIdentifierTest extends \PHPUnit\Framework\TestCase
15+
{
16+
/**
17+
* @var GetPageByIdentifier
18+
*/
19+
protected $getPageByIdentifierCommand;
20+
21+
/**
22+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\Page
23+
*/
24+
protected $page;
25+
26+
/**
27+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\PageFactory
28+
*/
29+
protected $pageFactory;
30+
31+
/**
32+
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Cms\Model\ResourceModel\Page
33+
*/
34+
protected $pageResource;
35+
36+
public function setUp()
37+
{
38+
$this->pageFactory = $this->getMockBuilder(\Magento\Cms\Model\PageFactory::class)
39+
->disableOriginalConstructor(true)
40+
->setMethods(['create'])
41+
->getMock();
42+
43+
$this->pageResource = $this->getMockBuilder(\Magento\Cms\Model\ResourceModel\Page::class)
44+
->disableOriginalConstructor(true)
45+
->getMock();
46+
47+
$this->page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
48+
->disableOriginalConstructor()
49+
->setMethods(['setStoreId', 'getId'])
50+
->getMock();
51+
52+
$this->getPageByIdentifierCommand = new GetPageByIdentifier($this->pageFactory, $this->pageResource);
53+
}
54+
55+
/**
56+
* Test for getByIdentifier method
57+
*/
58+
public function testGetByIdentifier()
59+
{
60+
$identifier = 'home';
61+
$storeId = 0;
62+
63+
$this->pageFactory->expects($this->once())
64+
->method('create')
65+
->willReturn($this->page);
66+
67+
$this->page->expects($this->once())
68+
->method('setStoreId')
69+
->willReturn($this->page);
70+
71+
$this->page->expects($this->once())
72+
->method('getId')
73+
->willReturn(1);
74+
75+
$this->pageResource->expects($this->once())
76+
->method('load')
77+
->with($this->page, $identifier)
78+
->willReturn($this->page);
79+
80+
$this->getPageByIdentifierCommand->execute($identifier, $storeId);
81+
}
82+
}

app/code/Magento/Cms/etc/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
type="Magento\Framework\Api\SearchResults" />
1111
<preference for="Magento\Cms\Api\Data\BlockSearchResultsInterface"
1212
type="Magento\Framework\Api\SearchResults" />
13+
<preference for="Magento\Cms\Api\GetBlockByIdentifierInterface" type="Magento\Cms\Model\GetBlockByIdentifier" />
14+
<preference for="Magento\Cms\Api\GetPageByIdentifierInterface" type="Magento\Cms\Model\GetPageByIdentifier" />
1315
<preference for="Magento\Cms\Api\Data\PageInterface" type="Magento\Cms\Model\Page" />
1416
<preference for="Magento\Cms\Api\Data\BlockInterface" type="Magento\Cms\Model\Block" />
1517
<preference for="Magento\Cms\Api\BlockRepositoryInterface" type="Magento\Cms\Model\BlockRepository" />
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Cms\Model;
7+
8+
/**
9+
* @magentoAppArea adminhtml
10+
*/
11+
class BlockTest extends \PHPUnit\Framework\TestCase
12+
{
13+
/**
14+
* Tests the get by identifier command
15+
* @param array $blockData
16+
* @throws \Exception
17+
* @throws \Magento\Framework\Exception\NoSuchEntityException
18+
* @magentoDbIsolation enabled
19+
* @dataProvider testGetByIdentifierDataProvider
20+
*/
21+
public function testGetByIdentifier(array $blockData)
22+
{
23+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
24+
25+
/** @var \Magento\Cms\Model\BlockFactory $blockFactory */
26+
/** @var \Magento\Cms\Model\ResourceModel\Block $blockResource */
27+
/** @var \Magento\Cms\Model\GetBlockByIdentifier $getBlockByIdentifierCommand */
28+
$blockResource = $objectManager->create(\Magento\Cms\Model\ResourceModel\Block::class);
29+
$blockFactory = $objectManager->create(\Magento\Cms\Model\BlockFactory::class);
30+
$getBlockByIdentifierCommand = $objectManager->create(\Magento\Cms\Model\GetBlockByIdentifier::class);
31+
32+
# Prepare and save the temporary block
33+
$tempBlock = $blockFactory->create();
34+
$tempBlock->setData($blockData);
35+
$blockResource->save($tempBlock);
36+
37+
# Load previously created block and compare identifiers
38+
$storeId = reset($blockData['stores']);
39+
$block = $getBlockByIdentifierCommand->execute($blockData['identifier'], $storeId);
40+
$this->assertEquals($blockData['identifier'], $block->getIdentifier());
41+
}
42+
43+
/**
44+
* Data provider for "testGetByIdentifier" method
45+
* @return array
46+
*/
47+
public function testGetByIdentifierDataProvider() : array
48+
{
49+
return [
50+
['data' => [
51+
'title' => 'Test title',
52+
'stores' => [0],
53+
'identifier' => 'test-identifier',
54+
'content' => 'Test content',
55+
'is_active' => 1
56+
]]
57+
];
58+
}
59+
}

0 commit comments

Comments
 (0)