Skip to content

Commit a3fab20

Browse files
committed
MC-29929: cmsBlocks that has scope limited to specific Store View can be seen on other Store Views in case there are Blocks with identical identifiers on both Store Views
- Fix case when block is assigned to all stores - stabilize builds
1 parent b32009d commit a3fab20

File tree

6 files changed

+98
-15
lines changed

6 files changed

+98
-15
lines changed

app/code/Magento/CmsGraphQl/Model/Resolver/DataProvider/Block.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Magento\Cms\Api\Data\BlockInterface;
1212
use Magento\Framework\Api\SearchCriteriaBuilder;
1313
use Magento\Framework\Exception\NoSuchEntityException;
14+
use Magento\Store\Model\Store;
1415
use Magento\Widget\Model\Template\FilterEmulate;
1516

1617
/**
@@ -91,7 +92,7 @@ private function fetchBlockData($identifier, string $field, int $storeId): array
9192
{
9293
$searchCriteria = $this->searchCriteriaBuilder
9394
->addFilter($field, $identifier)
94-
->addFilter('store_id', $storeId)
95+
->addFilter(Store::STORE_ID, [$storeId, Store::DEFAULT_STORE_ID], 'in')
9596
->addFilter(BlockInterface::IS_ACTIVE, true)->create();
9697

9798
$blockResults = $this->blockRepository->getList($searchCriteria)->getItems();

app/code/Magento/CmsGraphQl/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"php": "~7.3.0||~7.4.0",
77
"magento/framework": "*",
88
"magento/module-cms": "*",
9-
"magento/module-widget": "*"
9+
"magento/module-widget": "*",
10+
"magento/module-store": "*"
1011
},
1112
"suggest": {
1213
"magento/module-graph-ql": "*",

dev/tests/api-functional/testsuite/Magento/GraphQl/Cms/CmsBlockTest.php

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -216,29 +216,29 @@ public function testGetEnabledAndDisabledCmsBlockInOneRequest()
216216
*/
217217
public function testGetCmsBlockPerSpecificStore(): void
218218
{
219-
$blockIdentitifier1 = 'test-block';
220-
$blockIdentitifier2 = 'test-block-2';
219+
$blockIdentifier1 = 'test-block';
220+
$blockIdentifier2 = 'test-block-2';
221221
$secondStoreCode = 'second_store_view';
222222
$thirdStoreCode = 'third_store_view';
223223

224224
//Verify the correct block information for second store is returned
225-
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentitifier1, $secondStoreCode);
225+
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentifier1, $secondStoreCode);
226226
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseSecondStore);
227227
self::assertArrayHasKey('items', $cmsBlockResponseSecondStore['cmsBlocks']);
228228
self::assertEquals('test-block', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['identifier']);
229229
self::assertEquals('Second store block', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['title']);
230230
self::assertEquals('second_store_view', $cmsBlockResponseSecondStore['storeConfig']['code']);
231231

232232
//Verify the correct block information for third store is returned
233-
$cmsBlockResponseThirdStore = $this->getCmsBlockQuery($blockIdentitifier1, $thirdStoreCode);
233+
$cmsBlockResponseThirdStore = $this->getCmsBlockQuery($blockIdentifier1, $thirdStoreCode);
234234
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseThirdStore);
235235
self::assertArrayHasKey('items', $cmsBlockResponseThirdStore['cmsBlocks']);
236236
self::assertEquals('test-block', $cmsBlockResponseThirdStore['cmsBlocks']['items'][0]['identifier']);
237237
self::assertEquals('Third store block', $cmsBlockResponseThirdStore['cmsBlocks']['items'][0]['title']);
238238
self::assertEquals('third_store_view', $cmsBlockResponseThirdStore['storeConfig']['code']);
239239

240240
//Verify the correct block information for second block for second store is returned
241-
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentitifier2, $secondStoreCode);
241+
$cmsBlockResponseSecondStore = $this->getCmsBlockQuery($blockIdentifier2, $secondStoreCode);
242242
self::assertArrayHasKey('cmsBlocks', $cmsBlockResponseSecondStore);
243243
self::assertArrayHasKey('items', $cmsBlockResponseSecondStore['cmsBlocks']);
244244
self::assertEquals('test-block-2', $cmsBlockResponseSecondStore['cmsBlocks']['items'][0]['identifier']);
@@ -252,7 +252,7 @@ public function testGetCmsBlockPerSpecificStore(): void
252252
$query =
253253
<<<QUERY
254254
{
255-
cmsBlocks(identifiers: "$blockIdentitifier2") {
255+
cmsBlocks(identifiers: "$blockIdentifier2") {
256256
items {
257257
identifier
258258
title
@@ -271,31 +271,55 @@ public function testGetCmsBlockPerSpecificStore(): void
271271
* @magentoApiDataFixture Magento/Store/_files/multiple_websites_with_store_groups_stores.php
272272
* @magentoApiDataFixture Magento/Cms/_files/blocks_for_different_stores.php
273273
*/
274-
public function testGetCmsBlockforDisabledStore(): void
274+
public function testGetCmsBlockForDisabledStore(): void
275275
{
276-
$blockIdentitifier1 = 'test-block';
276+
$blockIdentifier = 'test-block';
277277
$thirdStoreCode = 'third_store_view';
278278
$store = Bootstrap::getObjectManager()->get(Store::class);
279279
$store->load('third_store_view', 'code')->setIsActive(0)->save();
280280
$this->expectException(\Exception::class);
281281
$this->expectExceptionMessage('Requested store is not found');
282-
$this->getCmsBlockQuery($blockIdentitifier1, $thirdStoreCode);
282+
$this->getCmsBlockQuery($blockIdentifier, $thirdStoreCode);
283+
}
284+
285+
/**
286+
* @magentoApiDataFixture Magento/Cms/_files/block_default_store.php
287+
*/
288+
public function testGetCmsBlockAssignedToDefaultStore(): void
289+
{
290+
$blockIdentifier = 'default_store_block';
291+
$query = <<<QUERY
292+
{
293+
cmsBlocks(identifiers: "$blockIdentifier") {
294+
items {
295+
identifier
296+
title
297+
content
298+
}
299+
}
300+
}
301+
QUERY;
302+
$response = $this->graphQlQuery($query);
303+
$this->assertArrayNotHasKey('errors', $response);
304+
$this->assertArrayHasKey('cmsBlocks', $response);
305+
$this->assertCount(1, $response['cmsBlocks']['items']);
306+
$this->assertEquals($blockIdentifier, $response['cmsBlocks']['items'][0]['identifier']);
283307
}
284308

285309
/**
286310
* Get cmsBlockQuery per store
287311
*
288-
* @param string $blockIdentitifier
312+
* @param string $blockIdentifier
289313
* @param string $storeCode
290314
* @return array
291315
* @throws \Exception
292316
*/
293-
private function getCmsBlockQuery($blockIdentitifier, $storeCode): array
317+
private function getCmsBlockQuery($blockIdentifier, $storeCode): array
294318
{
295319
$query =
296320
<<<QUERY
297321
{
298-
cmsBlocks(identifiers: "$blockIdentitifier") {
322+
cmsBlocks(identifiers: "$blockIdentifier") {
299323
items {
300324
identifier
301325
title
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Cms\Model\Block;
9+
use Magento\Store\Model\Store;
10+
use Magento\TestFramework\Helper\Bootstrap;
11+
12+
/** @var $block Block */
13+
$block = Bootstrap::getObjectManager()->create(Block::class);
14+
$block->setTitle(
15+
'CMS Block Title'
16+
)->setIdentifier(
17+
'default_store_block'
18+
)->setContent(
19+
'<h1>Fixture Block Title</h1>
20+
<a href="{{store url=""}}">store url</a>
21+
<p>Config value: "{{config path="web/unsecure/base_url"}}".</p>
22+
<p>Custom variable: "{{customvar code="variable_code"}}".</p>'
23+
)->setIsActive(
24+
1
25+
)->setStores(
26+
[Store::DEFAULT_STORE_ID]
27+
)->save();
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Cms\Api\BlockRepositoryInterface;
9+
use Magento\Cms\Api\Data\BlockInterface;
10+
use Magento\Framework\Api\SearchCriteriaBuilder;
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
13+
$objectManager = Bootstrap::getObjectManager();
14+
15+
/** @var BlockRepositoryInterface $blockRepository */
16+
$blockRepository = $objectManager->get(BlockRepositoryInterface::class);
17+
18+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
19+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
20+
$searchCriteria = $searchCriteriaBuilder->addFilter(BlockInterface::IDENTIFIER, 'default_store_block')
21+
->create();
22+
$result = $blockRepository->getList($searchCriteria);
23+
24+
/**
25+
* Tests which are wrapped with MySQL transaction clear all data by transaction rollback.
26+
* In that case there is "if" which checks that "fixture_block" still exists in database.
27+
*/
28+
foreach ($result->getItems() as $item) {
29+
$blockRepository->delete($item);
30+
}

dev/tests/integration/testsuite/Magento/Cms/_files/blocks_for_different_stores_rollback.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
1919
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
20-
$searchCriteria = $searchCriteriaBuilder->addFilter(BlockInterface::IDENTIFIER, '%test-block%' ,'like')
20+
$searchCriteria = $searchCriteriaBuilder->addFilter(BlockInterface::IDENTIFIER, '%test-block%', 'like')
2121
->create();
2222
$result = $blockRepository->getList($searchCriteria);
2323

0 commit comments

Comments
 (0)