Skip to content

Commit 6d72349

Browse files
author
Oleksandr Dubovyk
committed
Merge remote-tracking branches 'local/MC-39763' and 'local/MC-39463' into PRodubovyk20201222
3 parents a41ee31 + d2745c5 + 9bb960f commit 6d72349

File tree

9 files changed

+606
-23
lines changed

9 files changed

+606
-23
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@
5959
</argument>
6060
</arguments>
6161
</type>
62+
<type name="Magento\UrlRewrite\Model\UrlRewrite">
63+
<arguments>
64+
<argument name="entityToCacheTagMap" xsi:type="array">
65+
<item name="product" xsi:type="const">Magento\Catalog\Model\Product::CACHE_TAG</item>
66+
<item name="category" xsi:type="const">Magento\Catalog\Model\Category::CACHE_TAG</item>
67+
</argument>
68+
</arguments>
69+
</type>
6270
<type name="Magento\Eav\Model\Config">
6371
<arguments>
6472
<argument name="attributesForPreload" xsi:type="array">

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,11 @@
99
<type name="Magento\Cms\Model\ResourceModel\Page">
1010
<plugin name="cms_url_rewrite_plugin" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\ResourceModel\Page"/>
1111
</type>
12+
<type name="Magento\UrlRewrite\Model\UrlRewrite">
13+
<arguments>
14+
<argument name="entityToCacheTagMap" xsi:type="array">
15+
<item name="cms-page" xsi:type="const">Magento\Cms\Model\Page::CACHE_TAG</item>
16+
</argument>
17+
</arguments>
18+
</type>
1219
</config>

app/code/Magento/Review/Block/View.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,10 @@ public function getBackUrl()
103103
*/
104104
public function getRating()
105105
{
106+
$reviewId = $this->getReviewId() ?: $this->getReviewData()->getId();
106107
if (!$this->getRatingCollection()) {
107108
$ratingCollection = $this->_voteFactory->create()->getResourceCollection()->setReviewFilter(
108-
$this->getReviewId()
109+
$reviewId
109110
)->setStoreFilter(
110111
$this->_storeManager->getStore()->getId()
111112
)->addRatingInfo(

app/code/Magento/Review/view/frontend/templates/view.phtml

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,26 @@
3333
<caption class="table-caption"><?= $block->escapeHtml(__('Product Rating')) ?></caption>
3434
<?php foreach ($block->getRating() as $_rating): ?>
3535
<?php if ($_rating->getPercent()): ?>
36+
<?php $rating = ceil($_rating->getPercent()) ?>
3637
<tr>
37-
<td class="label"><?= $block->escapeHtml(__($_rating->getRatingCode())) ?></td>
38+
<td class="label" width="10%">
39+
<?= $block->escapeHtml(__($_rating->getRatingCode())) ?>
40+
</td>
3841
<td class="value">
39-
<div class="rating-box">
40-
<div class="rating"/>
42+
<?php $ratingId = $_rating->getRatingId() ?>
43+
<div class="rating-summary item"
44+
id="rating-div-<?= $block->escapeHtml($ratingId) ?>">
45+
<div class="rating-result" title="<?= /* @noEscape */ $rating ?>%">
46+
<span>
47+
<span><?= /* @noEscape */ $rating ?>%</span>
48+
</span>
49+
</div>
50+
<?= /* @noEscape */ $secureRenderer->renderStyleAsTag(
51+
"width:" . /* @noEscape */ $rating . "%",
52+
'div#rating-div-'.$_rating->getRatingId().
53+
'>div.rating-result>span:first-child'
54+
) ?>
4155
</div>
42-
<?= /* @noEscape */ $secureRenderer->renderStyleAsTag(
43-
"width:" . /* @noEscape */ ceil($_rating->getPercent()) . "%;",
44-
'div.rating-box div.rating'
45-
) ?>
4656
</td>
4757
</tr>
4858
<?php endif; ?>

app/code/Magento/UrlRewrite/Model/UrlRewrite.php

Lines changed: 154 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,17 @@
88
namespace Magento\UrlRewrite\Model;
99

1010
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Data\Collection\AbstractDb;
12+
use Magento\Framework\EntityManager\EventManager;
13+
use Magento\Framework\Indexer\CacheContext;
14+
use Magento\Framework\Model\AbstractModel;
15+
use Magento\Framework\Model\Context;
16+
use Magento\Framework\Model\ResourceModel\AbstractResource;
17+
use Magento\Framework\Registry;
1118
use Magento\Framework\Serialize\Serializer\Json;
19+
use Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite;
20+
use Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollection;
21+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite as UrlRewriteService;
1222

1323
/**
1424
* UrlRewrite model class
@@ -27,32 +37,65 @@
2737
* @method UrlRewrite setStoreId($value)
2838
* @method UrlRewrite setDescription($value)
2939
*/
30-
class UrlRewrite extends \Magento\Framework\Model\AbstractModel
40+
class UrlRewrite extends AbstractModel
3141
{
3242
/**
3343
* @var Json
3444
*/
3545
private $serializer;
3646

47+
/**
48+
* @var CacheContext|mixed|null
49+
*/
50+
private $cacheContext;
51+
52+
/**
53+
* @var EventManager|mixed|null
54+
*/
55+
private $eventManager;
56+
57+
/**
58+
* @var array
59+
*/
60+
private $entityToCacheTagMap;
61+
62+
/**
63+
* @var UrlFinderInterface
64+
*/
65+
private $urlFinder;
66+
3767
/**
3868
* UrlRewrite constructor.
3969
*
40-
* @param \Magento\Framework\Model\Context $context
41-
* @param \Magento\Framework\Registry $registry
42-
* @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
43-
* @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
70+
* @param Context $context
71+
* @param Registry $registry
72+
* @param AbstractResource|null $resource
73+
* @param AbstractDb|null $resourceCollection
4474
* @param array $data
45-
* @param Json $serializer
75+
* @param Json|null $serializer
76+
* @param CacheContext|null $cacheContext
77+
* @param EventManager|null $eventManager
78+
* @param UrlFinderInterface|null $urlFinder
79+
* @param array $entityToCacheTagMap
4680
*/
4781
public function __construct(
48-
\Magento\Framework\Model\Context $context,
49-
\Magento\Framework\Registry $registry,
50-
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
51-
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
82+
Context $context,
83+
Registry $registry,
84+
AbstractResource $resource = null,
85+
AbstractDb $resourceCollection = null,
5286
array $data = [],
53-
Json $serializer = null
54-
) {
87+
Json $serializer = null,
88+
CacheContext $cacheContext = null,
89+
EventManager $eventManager = null,
90+
UrlFinderInterface $urlFinder = null,
91+
array $entityToCacheTagMap = []
92+
)
93+
{
5594
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
95+
$this->cacheContext = $cacheContext ?: ObjectManager::getInstance()->get(CacheContext::class);
96+
$this->eventManager = $eventManager ?: ObjectManager::getInstance()->get(EventManager::class);
97+
$this->urlFinder = $urlFinder ?: ObjectManager::getInstance()->get(UrlFinderInterface::class);
98+
$this->entityToCacheTagMap = $entityToCacheTagMap;
5699
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
57100
}
58101

@@ -63,8 +106,8 @@ public function __construct(
63106
*/
64107
protected function _construct()
65108
{
66-
$this->_init(\Magento\UrlRewrite\Model\ResourceModel\UrlRewrite::class);
67-
$this->_collectionName = \Magento\UrlRewrite\Model\ResourceModel\UrlRewriteCollection::class;
109+
$this->_init(ResourceModel\UrlRewrite::class);
110+
$this->_collectionName = UrlRewriteCollection::class;
68111
}
69112

70113
/**
@@ -92,4 +135,101 @@ public function setMetadata($metadata)
92135
}
93136
return $this->setData(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA, $metadata);
94137
}
138+
139+
/**
140+
* Gets final target UrlRewrite for custom rewrite record
141+
*
142+
* @param string $path
143+
* @param int $storeId
144+
* @return UrlRewriteService|null
145+
*/
146+
private function getFinalTargetUrlRewrite(string $path, int $storeId): ?UrlRewriteService
147+
{
148+
$urlRewriteTarget = $this->urlFinder->findOneByData(
149+
[
150+
'request_path' => $path,
151+
'store_id' => $storeId
152+
]
153+
);
154+
155+
while (
156+
$urlRewriteTarget &&
157+
$urlRewriteTarget->getTargetPath() !== $urlRewriteTarget->getRequestPath() &&
158+
$urlRewriteTarget->getRedirectType() > 0
159+
) {
160+
$urlRewriteTarget = $this->urlFinder->findOneByData(
161+
[
162+
'request_path' => $urlRewriteTarget->getTargetPath(),
163+
'store_id' => $urlRewriteTarget->getStoreId()
164+
]
165+
);
166+
}
167+
168+
return $urlRewriteTarget;
169+
}
170+
171+
/**
172+
* Clean the cache for entities affected by current rewrite
173+
*/
174+
public function cleanEntitiesCache()
175+
{
176+
if (!$this->isEmpty()) {
177+
if ($this->getEntityType() === Rewrite::ENTITY_TYPE_CUSTOM) {
178+
$urlRewrite = $this->getFinalTargetUrlRewrite(
179+
$this->getTargetPath(),
180+
(int)$this->getStoreId()
181+
);
182+
183+
if ($urlRewrite) {
184+
$this->cleanCacheForEntity($urlRewrite->getEntityType(), (int) $urlRewrite->getEntityId());
185+
}
186+
187+
if ($this->getOrigData() && $this->getOrigData('target_path') !== $this->getTargetPath()) {
188+
$origUrlRewrite = $this->getFinalTargetUrlRewrite(
189+
$this->getOrigData('target_path'),
190+
(int)$this->getOrigData('store_id')
191+
);
192+
193+
if ($origUrlRewrite) {
194+
$this->cleanCacheForEntity($origUrlRewrite->getEntityType(), (int) $origUrlRewrite->getEntityId());
195+
}
196+
}
197+
} else {
198+
$this->cleanCacheForEntity($this->getEntityType(), (int) $this->getEntityId());
199+
}
200+
}
201+
}
202+
203+
/**
204+
* Clean cache for specified entity type by id
205+
*
206+
* @param string $entityType
207+
* @param int $entityId
208+
*/
209+
private function cleanCacheForEntity(string $entityType, int $entityId)
210+
{
211+
if (array_key_exists($entityType, $this->entityToCacheTagMap)) {
212+
$cacheKey = $this->entityToCacheTagMap[$entityType];
213+
$this->cacheContext->registerEntities($cacheKey, [$entityId]);
214+
$this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
215+
}
216+
}
217+
218+
/**
219+
* @inheritdoc
220+
*/
221+
public function afterDelete()
222+
{
223+
$this->_getResource()->addCommitCallback([$this, 'cleanEntitiesCache']);
224+
return parent::afterDelete();
225+
}
226+
227+
/**
228+
* @inheritdoc
229+
*/
230+
public function afterSave()
231+
{
232+
$this->_getResource()->addCommitCallback([$this, 'cleanEntitiesCache']);
233+
return parent::afterSave();
234+
}
95235
}

0 commit comments

Comments
 (0)