Skip to content

Commit b420851

Browse files
committed
ACP2E-1494: Url Rewrite to external URL does not work on GraphQL
1 parent 1c874bd commit b420851

File tree

9 files changed

+529
-102
lines changed

9 files changed

+529
-102
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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+
namespace Magento\CatalogUrlRewrite\Test\Fixture;
9+
10+
use Magento\Catalog\Api\CategoryRepositoryInterface;
11+
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlFinderInterface;
16+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
17+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
18+
use Magento\UrlRewrite\Test\Fixture\UrlRewrite;
19+
20+
class CategoryUrlRewrite extends UrlRewrite
21+
{
22+
private const DEFAULT_DATA = [
23+
UrlRewriteDataModel::ENTITY_TYPE => 'category',
24+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
25+
UrlRewriteDataModel::STORE_ID => 1
26+
];
27+
28+
/**
29+
* @var CategoryRepositoryInterface
30+
*/
31+
private CategoryRepositoryInterface $categoryRepository;
32+
33+
/**
34+
* @var CategoryUrlPathGenerator
35+
*/
36+
private CategoryUrlPathGenerator $categoryUrlPathGenerator;
37+
38+
/**
39+
* @var UrlFinderInterface
40+
*/
41+
private UrlFinderInterface $urlFinder;
42+
43+
/**
44+
* @inheritDoc
45+
*/
46+
public function __construct(
47+
UrlRewriteFactory $urlRewriteFactory,
48+
UrlRewriteResourceModel $urlRewriteResourceModel,
49+
ProcessorInterface $dataProcessor,
50+
CategoryRepositoryInterface $categoryRepository,
51+
CategoryUrlPathGenerator $categoryUrlPathGenerator,
52+
UrlFinderInterface $urlFinder
53+
) {
54+
parent::__construct($urlRewriteFactory, $urlRewriteResourceModel, $dataProcessor);
55+
$this->categoryRepository = $categoryRepository;
56+
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
57+
$this->urlFinder = $urlFinder;
58+
}
59+
60+
/**
61+
* @inheritDoc
62+
*/
63+
public function apply(array $data = []): ?DataObject
64+
{
65+
return parent::apply($this->prepareData($data));
66+
}
67+
68+
/**
69+
* Prepare default data
70+
*
71+
* @param array $data
72+
* @return array
73+
* @throws \Magento\Framework\Exception\NoSuchEntityException
74+
*/
75+
private function prepareData(array $data): array
76+
{
77+
$data = array_merge(self::DEFAULT_DATA, $data);
78+
$category = $this->categoryRepository->get(
79+
$data[UrlRewriteDataModel::ENTITY_ID],
80+
$data[UrlRewriteDataModel::STORE_ID]
81+
);
82+
if (!isset($data[UrlRewriteDataModel::TARGET_PATH])) {
83+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->categoryUrlPathGenerator->getCanonicalUrlPath($category);
84+
if ($data[UrlRewriteDataModel::REDIRECT_TYPE]) {
85+
$rewrite = $this->urlFinder->findOneByData(
86+
[
87+
UrlRewriteDataModel::ENTITY_ID => $data[UrlRewriteDataModel::ENTITY_ID],
88+
UrlRewriteDataModel::TARGET_PATH => $data[UrlRewriteDataModel::TARGET_PATH],
89+
UrlRewriteDataModel::ENTITY_TYPE => $data[UrlRewriteDataModel::ENTITY_TYPE],
90+
UrlRewriteDataModel::STORE_ID => $data[UrlRewriteDataModel::STORE_ID],
91+
]
92+
);
93+
if ($rewrite) {
94+
$data[UrlRewriteDataModel::TARGET_PATH] = $rewrite->getRequestPath();
95+
} else {
96+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->categoryUrlPathGenerator->getUrlPath($category);
97+
}
98+
}
99+
}
100+
return $data;
101+
}
102+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
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+
namespace Magento\CatalogUrlRewrite\Test\Fixture;
9+
10+
use Magento\Catalog\Api\ProductRepositoryInterface;
11+
use Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlFinderInterface;
16+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
17+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
18+
use Magento\UrlRewrite\Test\Fixture\UrlRewrite;
19+
20+
class ProductUrlRewrite extends UrlRewrite
21+
{
22+
private const DEFAULT_DATA = [
23+
UrlRewriteDataModel::ENTITY_TYPE => 'category',
24+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
25+
UrlRewriteDataModel::STORE_ID => 1
26+
];
27+
28+
/**
29+
* @var ProductRepositoryInterface
30+
*/
31+
private ProductRepositoryInterface $productRepository;
32+
33+
/**
34+
* @var ProductUrlPathGenerator
35+
*/
36+
private ProductUrlPathGenerator $productUrlPathGenerator;
37+
38+
/**
39+
* @var UrlFinderInterface
40+
*/
41+
private UrlFinderInterface $urlFinder;
42+
43+
/**
44+
* @inheritDoc
45+
*/
46+
public function __construct(
47+
UrlRewriteFactory $urlRewriteFactory,
48+
UrlRewriteResourceModel $urlRewriteResourceModel,
49+
ProcessorInterface $dataProcessor,
50+
ProductRepositoryInterface $productRepository,
51+
ProductUrlPathGenerator $productUrlPathGenerator,
52+
UrlFinderInterface $urlFinder
53+
) {
54+
parent::__construct($urlRewriteFactory, $urlRewriteResourceModel, $dataProcessor);
55+
$this->productRepository = $productRepository;
56+
$this->productUrlPathGenerator = $productUrlPathGenerator;
57+
$this->urlFinder = $urlFinder;
58+
}
59+
60+
/**
61+
* @inheritDoc
62+
*/
63+
public function apply(array $data = []): ?DataObject
64+
{
65+
return parent::apply($this->prepareData($data));
66+
}
67+
68+
/**
69+
* Prepare default data
70+
*
71+
* @param array $data
72+
* @return array
73+
* @throws \Magento\Framework\Exception\NoSuchEntityException
74+
*/
75+
private function prepareData(array $data): array
76+
{
77+
$data = array_merge(self::DEFAULT_DATA, $data);
78+
$product = $this->productRepository->getById(
79+
$data[UrlRewriteDataModel::ENTITY_ID],
80+
storeId: $data[UrlRewriteDataModel::STORE_ID]
81+
);
82+
if (!isset($data[UrlRewriteDataModel::TARGET_PATH])) {
83+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->productUrlPathGenerator->getCanonicalUrlPath($product);
84+
if ($data[UrlRewriteDataModel::REDIRECT_TYPE]) {
85+
$rewrite = $this->urlFinder->findOneByData(
86+
[
87+
UrlRewriteDataModel::ENTITY_ID => $data[UrlRewriteDataModel::ENTITY_ID],
88+
UrlRewriteDataModel::TARGET_PATH => $data[UrlRewriteDataModel::TARGET_PATH],
89+
UrlRewriteDataModel::ENTITY_TYPE => $data[UrlRewriteDataModel::ENTITY_TYPE],
90+
UrlRewriteDataModel::STORE_ID => $data[UrlRewriteDataModel::STORE_ID],
91+
]
92+
);
93+
if ($rewrite) {
94+
$data[UrlRewriteDataModel::TARGET_PATH] = $rewrite->getRequestPath();
95+
} else {
96+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->productUrlPathGenerator->getUrlPath($product);
97+
}
98+
}
99+
}
100+
return $data;
101+
}
102+
}
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+
declare(strict_types=1);
7+
8+
namespace Magento\CmsUrlRewrite\Test\Fixture;
9+
10+
use Magento\Cms\Api\PageRepositoryInterface;
11+
use Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator;
12+
use Magento\Framework\DataObject;
13+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
14+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
15+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
16+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
17+
use Magento\UrlRewrite\Test\Fixture\UrlRewrite;
18+
19+
class CmsPageUrlRewrite extends UrlRewrite
20+
{
21+
private const DEFAULT_DATA = [
22+
UrlRewriteDataModel::ENTITY_TYPE => 'cms-page',
23+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
24+
UrlRewriteDataModel::STORE_ID => 1
25+
];
26+
27+
/**
28+
* @var PageRepositoryInterface
29+
*/
30+
private PageRepositoryInterface $pageRepository;
31+
32+
/**
33+
* @var CmsPageUrlPathGenerator
34+
*/
35+
private CmsPageUrlPathGenerator $cmsPageUrlPathGenerator;
36+
37+
/**
38+
* @inheritDoc
39+
*/
40+
public function __construct(
41+
UrlRewriteFactory $urlRewriteFactory,
42+
UrlRewriteResourceModel $urlRewriteResourceModel,
43+
ProcessorInterface $dataProcessor,
44+
PageRepositoryInterface $pageRepository,
45+
CmsPageUrlPathGenerator $cmsPageUrlPathGenerator
46+
) {
47+
parent::__construct($urlRewriteFactory, $urlRewriteResourceModel, $dataProcessor);
48+
$this->pageRepository = $pageRepository;
49+
$this->cmsPageUrlPathGenerator = $cmsPageUrlPathGenerator;
50+
}
51+
52+
/**
53+
* @inheritDoc
54+
*/
55+
public function apply(array $data = []): ?DataObject
56+
{
57+
return parent::apply($this->prepareData($data));
58+
}
59+
60+
/**
61+
* Prepare default data
62+
*
63+
* @param array $data
64+
* @return array
65+
* @throws \Magento\Framework\Exception\NoSuchEntityException
66+
*/
67+
private function prepareData(array $data): array
68+
{
69+
$data = array_merge(self::DEFAULT_DATA, $data);
70+
$page = $this->pageRepository->getById(
71+
$data[UrlRewriteDataModel::ENTITY_ID]
72+
);
73+
if (!isset($data[UrlRewriteDataModel::TARGET_PATH])) {
74+
if ($data[UrlRewriteDataModel::REDIRECT_TYPE]) {
75+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->cmsPageUrlPathGenerator->getUrlPath($page);
76+
} else {
77+
$data[UrlRewriteDataModel::TARGET_PATH] = $this->cmsPageUrlPathGenerator->getCanonicalUrlPath($page);
78+
}
79+
}
80+
return $data;
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+
declare(strict_types=1);
7+
8+
namespace Magento\UrlRewrite\Test\Fixture;
9+
10+
use Magento\Framework\DataObject;
11+
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
12+
use Magento\TestFramework\Fixture\RevertibleDataFixtureInterface;
13+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel;
14+
use Magento\UrlRewrite\Model\UrlRewriteFactory;
15+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteDataModel;
16+
17+
class UrlRewrite implements RevertibleDataFixtureInterface
18+
{
19+
private const DEFAULT_DATA = [
20+
UrlRewriteDataModel::URL_REWRITE_ID => null,
21+
UrlRewriteDataModel::ENTITY_ID => 0,
22+
UrlRewriteDataModel::ENTITY_TYPE => 'custom',
23+
UrlRewriteDataModel::IS_AUTOGENERATED => 0,
24+
UrlRewriteDataModel::REQUEST_PATH => '%uniqid%_request_path',
25+
UrlRewriteDataModel::TARGET_PATH => '%uniqid%_target_path',
26+
UrlRewriteDataModel::STORE_ID => 1,
27+
UrlRewriteDataModel::REDIRECT_TYPE => 0,
28+
UrlRewriteDataModel::DESCRIPTION => null,
29+
UrlRewriteDataModel::METADATA => null,
30+
];
31+
/**
32+
* @var UrlRewriteFactory
33+
*/
34+
private UrlRewriteFactory $urlRewriteFactory;
35+
36+
/**
37+
* @var UrlRewriteResourceModel
38+
*/
39+
private UrlRewriteResourceModel $urlRewriteResourceModel;
40+
41+
/**
42+
* @var ProcessorInterface
43+
*/
44+
private ProcessorInterface $dataProcessor;
45+
46+
/**
47+
* @inheritDoc
48+
*/
49+
public function __construct(
50+
UrlRewriteFactory $urlRewriteFactory,
51+
UrlRewriteResourceModel $urlRewriteResourceModel,
52+
ProcessorInterface $dataProcessor
53+
) {
54+
$this->urlRewriteFactory = $urlRewriteFactory;
55+
$this->urlRewriteResourceModel = $urlRewriteResourceModel;
56+
$this->dataProcessor = $dataProcessor;
57+
}
58+
59+
/**
60+
* @inheritDoc
61+
*/
62+
public function apply(array $data = []): ?DataObject
63+
{
64+
$data = $this->dataProcessor->process($this, array_merge(self::DEFAULT_DATA, $data));
65+
$urlRewrite = $this->urlRewriteFactory->create();
66+
$urlRewrite->setData($data);
67+
$this->urlRewriteResourceModel->save($urlRewrite);
68+
return $urlRewrite;
69+
}
70+
71+
/**
72+
* @inheritDoc
73+
*/
74+
public function revert(DataObject $data): void
75+
{
76+
$urlRewrite = $this->urlRewriteFactory->create();
77+
$this->urlRewriteResourceModel->load($urlRewrite, $data->getId());
78+
if ($urlRewrite->getId()) {
79+
$this->urlRewriteResourceModel->delete($urlRewrite);
80+
}
81+
}
82+
}

0 commit comments

Comments
 (0)