Skip to content

Commit 2096cc9

Browse files
ENGCOM-1210: #13296: Category name with special characters brakes … #13402
- Merge Pull Request #13402 from vinayshah/magento2:2.3-develop_13296 - Merged commits: 1. bd5834c 2. 46feb0b 3. aa31ff8 4. c136ce8 5. 9b67a3e 6. 6e1ac10 7. 9a73e4c 8. f6c4efd 9. b8b000b 10. 33144f9 11. 47b5440 12. 2ef98ac 13. 3ce79eb 14. 8b8d5ce 15. 2c97259 16. de3b966 17. 597d548 18. 30989e1 19. b9d2e53 20. b52787a
2 parents 431d0d3 + b52787a commit 2096cc9

File tree

7 files changed

+102
-20
lines changed

7 files changed

+102
-20
lines changed

app/code/Magento/Catalog/view/adminhtml/web/js/category-tree.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55

66
define([
77
'jquery',
8+
'mageUtils',
89
'jquery/ui',
910
'jquery/jstree/jquery.jstree'
10-
], function ($) {
11+
], function ($, utils) {
1112
'use strict';
1213

1314
$.widget('mage.categoryTree', {
@@ -90,7 +91,7 @@ define([
9091
}
9192
result = {
9293
data: {
93-
title: node.name + ' (' + node['product_count'] + ')'
94+
title: utils.unescape(node.name) + ' (' + node['product_count'] + ')'
9495
},
9596
attr: {
9697
'class': node.cls + (!!node.disabled ? ' disabled' : '') //eslint-disable-line no-extra-boolean-cast

app/code/Magento/UrlRewrite/Block/Catalog/Category/Tree.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\UrlRewrite\Block\Catalog\Category;
78

89
use Magento\Catalog\Api\CategoryRepositoryInterface;

app/code/Magento/UrlRewrite/view/adminhtml/templates/categories.phtml

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,27 @@
88

99
/** @var \Magento\UrlRewrite\Block\Catalog\Category\Tree $block */
1010
?>
11-
<fieldset class="admin__fieldset" data-ui-id="category-selector">
12-
<legend class="admin__legend"><span><?= $block->escapeHtml(__('Select Category')) ?></span></legend>
13-
<div class="content content-category-tree">
14-
<input type="hidden" name="categories" id="product_categories" value="" />
15-
<?php if ($block->getRoot()): ?>
16-
<div data-mage-init='<?php /* @noEscape */ echo $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode(
17-
[
18-
'categoryTree' => [
19-
'data' => $block->getTreeArray(),
20-
'url' => $block->escapeUrl($block->getLoadTreeUrl()),
21-
],
22-
]
23-
); ?>' class="jstree-default"></div>
24-
<?php endif; ?>
25-
</div>
26-
</fieldset>
11+
<fieldset class="admin__fieldset" data-ui-id="category-selector">
12+
<legend class="admin__legend"><span><?= $block->escapeHtml(__('Select Category')) ?></span></legend>
13+
<div class="content content-category-tree">
14+
<input type="hidden" name="categories" id="product_categories" value=""/>
15+
<?php if ($block->getRoot()): ?>
16+
<div class="jstree-default"></div>
17+
<?php endif; ?>
18+
</div>
19+
</fieldset>
20+
<?php if ($block->getRoot()): ?>
21+
<script type="text/x-magento-init">
22+
{
23+
".jstree-default": {
24+
"categoryTree": {
25+
"data": <?php /* @noEscape */
26+
echo $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($block->getTreeArray()); ?>,
27+
"url": "<?php /* @noEscape */
28+
echo $block->escapeUrl($block->getLoadTreeUrl()); ?>"
29+
}
30+
}
31+
}
32+
33+
</script>
34+
<?php endif; ?>
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+
/** @var $category \Magento\Catalog\Model\Category */
9+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
10+
11+
$categoryFirst = $objectManager->create(\Magento\Catalog\Model\Category::class);
12+
$categoryFirst->setName('Category 1')
13+
->setPath('1/2')
14+
->setLevel(2)
15+
->setAvailableSortBy('name')
16+
->setDefaultSortBy('name')
17+
->setIsActive(true)
18+
->setPosition(1)
19+
->save();
20+
21+
// products from this fixture were moved to indexer_catalog_products.php
22+
$categorySecond = $objectManager->create(\Magento\Catalog\Model\Category::class);
23+
$categorySecond->setName('"Category 6"')
24+
->setPath($categoryFirst->getPath())
25+
->setLevel(3)
26+
->setAvailableSortBy('name')
27+
->setDefaultSortBy('name')
28+
->setIsActive(true)
29+
->setPosition(1)
30+
->save();

dev/tests/integration/testsuite/Magento/UrlRewrite/Block/Catalog/Category/TreeTest.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\UrlRewrite\Block\Catalog\Category;
78

89
/**
@@ -56,7 +57,27 @@ public function testGetTreeArrayApostropheReplaced()
5657
$tree = $this->_treeBlock->getTreeArray();
5758

5859
$this->assertNotContains('\'', $tree['children'][0]['children'][0]['children'][0]['name']);
59-
$this->assertEquals('&#039;Category 6&#039;', $tree['children'][0]['children'][0]['children'][0]['name']);
60+
$this->assertEquals(
61+
'&#039;Category 6&#039;',
62+
$tree['children'][0]['children'][0]['children'][0]['name']
63+
);
64+
}
65+
66+
/**
67+
* Test that the getTreeArray() method scrubs single quotes and apostrophes from names
68+
*
69+
* @magentoAppIsolation enabled
70+
* @magentoDataFixture Magento/Catalog/_files/catalog_category_with_doublequotes.php
71+
*/
72+
public function testGetTreeArrayDoubleQuotesReplaced()
73+
{
74+
$tree = $this->_treeBlock->getTreeArray();
75+
76+
$this->assertNotContains('\"', $tree['children'][0]['children'][0]['children'][0]['name']);
77+
$this->assertEquals(
78+
'&quot;Category 6&quot;',
79+
$tree['children'][0]['children'][0]['children'][0]['name']
80+
);
6081
}
6182

6283
/**

lib/web/mage/utils/misc.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,26 @@ define([
242242
return data;
243243
},
244244

245+
/**
246+
* Replaces symbol codes with their unescaped counterparts.
247+
*
248+
* @param {String} data
249+
*
250+
* @returns {String}
251+
*/
252+
unescape: function (data) {
253+
var unescaped = _.unescape(data),
254+
mapCharacters = {
255+
'&#039;': '\''
256+
};
257+
258+
_.each(mapCharacters, function (value, key) {
259+
unescaped = unescaped.replace(key, value);
260+
});
261+
262+
return unescaped;
263+
},
264+
245265
/**
246266
* Converts PHP IntlFormatter format to moment format.
247267
*

lib/web/underscore.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,8 @@
13271327
'>': '&gt;',
13281328
'"': '&quot;',
13291329
"'": '&#x27;',
1330-
'`': '&#x60;'
1330+
'`': '&#x60;',
1331+
"'": '&#039;',
13311332
};
13321333
var unescapeMap = _.invert(escapeMap);
13331334

0 commit comments

Comments
 (0)