Skip to content

Commit 984b16c

Browse files
authored
Merge pull request #151 from magento-commerce/fix/product-special-charachter
Fixed product special characters incorrectly rendering
2 parents 1727c60 + aad4ca1 commit 984b16c

File tree

9 files changed

+149
-83
lines changed

9 files changed

+149
-83
lines changed

app/code/Meta/BusinessExtension/composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
"magento/module-security": "*",
1414
"magento/module-store": "*",
1515
"magento/module-newsletter": "*",
16-
"meta/module-sales": "*",
1716
"facebook/php-business-sdk": "^15.0.0"
1817
},
1918
"autoload": {

app/code/Meta/BusinessExtension/etc/module.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
<module name="Magento_Security"/>
1010
<module name="Magento_Store"/>
1111
<module name="Magento_Newsletter"/>
12-
<module name="Meta_Sales"/>
1312
</sequence>
1413
</module>
1514
</config>

app/code/Meta/Catalog/Model/Product/Feed/Builder.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,16 @@ class Builder
121121
private $stripTags;
122122

123123
/**
124+
* Constructor
125+
*
124126
* @param FBEHelper $fbeHelper
125127
* @param SystemConfig $systemConfig
126128
* @param CategoryCollectionFactory $categoryCollectionFactory
127129
* @param BuilderTools $builderTools
128130
* @param ProductIdentifier $productIdentifier
129131
* @param CatalogHelper $catalogHelper
132+
* @param InventoryInterface $inventory
133+
* @param Escaper $escaper
130134
* @param StripTagsFactory $stripTags
131135
*/
132136
public function __construct(
@@ -139,8 +143,7 @@ public function __construct(
139143
InventoryInterface $inventory,
140144
Escaper $escaper,
141145
StripTagsFactory $stripTags
142-
)
143-
{
146+
) {
144147
$this->fbeHelper = $fbeHelper;
145148
$this->systemConfig = $systemConfig;
146149
$this->categoryCollectionFactory = $categoryCollectionFactory;
@@ -392,9 +395,11 @@ protected function getDescription(Product $product)
392395
$productTitle = $this->trimAttribute(self::ATTR_NAME, $title);
393396

394397
$description = $description ?: $productTitle;
395-
// description can't be all uppercase
396-
$description = $this->builderTools->htmlDecode($description);
397-
return addslashes($this->builderTools->lowercaseIfAllCaps($description));
398+
// phpcs:ignore
399+
$description = html_entity_decode($description);
400+
// phpcs:ignore
401+
$description = html_entity_decode(preg_replace( '/<[^<]+?>/', '', $description));
402+
return $this->builderTools->lowercaseIfAllCaps($description);
398403
}
399404

400405
/**
@@ -550,7 +555,7 @@ public function buildProductEntry(Product $product)
550555
$entry = [
551556
self::ATTR_RETAILER_ID => $this->trimAttribute(self::ATTR_RETAILER_ID, $retailerId),
552557
self::ATTR_ITEM_GROUP_ID => $this->getItemGroupId($product),
553-
self::ATTR_NAME => $productTitle,
558+
self::ATTR_NAME => $this->escaper->escapeUrl($productTitle),
554559
self::ATTR_DESCRIPTION => $this->getDescription($product),
555560
self::ATTR_RICH_DESCRIPTION => $this->getRichDescription($product),
556561
self::ATTR_AVAILABILITY => $inventory->getAvailability(),

app/code/Meta/Conversion/Model/Tracker/ViewContent.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Meta\Conversion\Helper\MagentoDataHelper;
88
use Magento\Catalog\Api\ProductRepositoryInterface;
99
use Meta\Conversion\Api\TrackerInterface;
10+
use Magento\Framework\Escaper;
1011

1112
class ViewContent implements TrackerInterface
1213
{
@@ -23,16 +24,24 @@ class ViewContent implements TrackerInterface
2324
*/
2425
private $productRepository;
2526

27+
/**
28+
* @var Escaper
29+
*/
30+
private $escaper;
31+
2632
/**
2733
* @param MagentoDataHelper $magentoDataHelper
2834
* @param ProductRepositoryInterface $productRepository
35+
* @param Escaper $escaper
2936
*/
3037
public function __construct(
3138
MagentoDataHelper $magentoDataHelper,
32-
ProductRepositoryInterface $productRepository
39+
ProductRepositoryInterface $productRepository,
40+
Escaper $escaper
3341
) {
3442
$this->magentoDataHelper = $magentoDataHelper;
3543
$this->productRepository = $productRepository;
44+
$this->escaper = $escaper;
3645
}
3746

3847
/**
@@ -57,7 +66,7 @@ public function getPayload(array $params): array
5766
'value' => $this->magentoDataHelper->getValueForProduct($product),
5867
'content_ids' => [$contentId],
5968
'content_category' => $this->magentoDataHelper->getCategoriesForProduct($product),
60-
'content_name' => $product->getName(),
69+
'content_name' => $this->escaper->escapeUrl($product->getName()),
6170
'contents' => [
6271
[
6372
'id' => $contentId,

app/code/Meta/Conversion/Observer/AddToCart.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Magento\Framework\App\RequestInterface;
2424
use Magento\Framework\Event\Observer;
2525
use Magento\Framework\Event\ObserverInterface;
26+
use Magento\Framework\Escaper;
2627

2728
use Meta\Conversion\Helper\ServerEventFactory;
2829

@@ -48,23 +49,32 @@ class AddToCart implements ObserverInterface
4849
*/
4950
protected $request;
5051

52+
/**
53+
* @var Escaper
54+
*/
55+
private $escaper;
56+
5157
/**
5258
* Constructor
59+
*
5360
* @param FBEHelper $fbeHelper
5461
* @param MagentoDataHelper $magentoDataHelper
5562
* @param ServerSideHelper $serverSideHelper
5663
* @param RequestInterface $request
64+
* @param Escaper $escaper
5765
*/
5866
public function __construct(
5967
FBEHelper $fbeHelper,
6068
MagentoDataHelper $magentoDataHelper,
6169
ServerSideHelper $serverSideHelper,
62-
RequestInterface $request
70+
RequestInterface $request,
71+
Escaper $escaper
6372
) {
6473
$this->fbeHelper = $fbeHelper;
6574
$this->magentoDataHelper = $magentoDataHelper;
6675
$this->serverSideHelper = $serverSideHelper;
6776
$this->request = $request;
77+
$this->escaper = $escaper;
6878
}
6979

7080
/**
@@ -91,7 +101,7 @@ public function execute(Observer $observer)
91101
'content_type' => $this->magentoDataHelper->getContentType($product),
92102
'content_ids' => [$this->magentoDataHelper->getContentId($product)],
93103
'content_category' => $this->magentoDataHelper->getCategoriesForProduct($product),
94-
'content_name' => $product->getName()
104+
'content_name' => $this->escaper->escapeUrl($product->getName())
95105
];
96106
$event = ServerEventFactory::createEvent('AddToCart', $customData, $eventId);
97107
$this->serverSideHelper->sendEvent($event);

app/code/Meta/Conversion/Test/Unit/Observer/AddToCartTest.php

Lines changed: 110 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,40 @@
1717

1818
namespace Meta\Conversion\Test\Unit\Observer;
1919

20-
use Meta\Conversion\Helper\AAMFieldsExtractorHelper;
21-
use Meta\Conversion\Helper\ServerSideHelper;
2220
use Meta\Conversion\Observer\AddToCart;
21+
use Meta\Conversion\Helper\ServerSideHelper;
2322
use Magento\Framework\App\RequestInterface;
23+
use Magento\Framework\Escaper;
2424
use Magento\Framework\Event\Observer;
25-
use PHPUnit\Framework\MockObject\MockObject;
25+
use Magento\Catalog\Model\Product;
2626

2727
class AddToCartTest extends CommonTest
2828
{
29+
2930
/**
30-
* @var MockObject
31+
* @var ServerSideHelper
3132
*/
32-
protected $request;
33+
private $serverSideHelper;
3334

3435
/**
35-
* @var AddToCart
36+
* @var RequestInterface
3637
*/
37-
protected $addToCartObserver;
38+
private $request;
3839

3940
/**
40-
* @var ServerSideHelper
41+
* @var Escaper
4142
*/
42-
protected $serverSideHelper;
43+
private $escaper;
4344

4445
/**
45-
* @var AAMFieldsExtractorHelper
46+
* @var ObserverInterface
4647
*/
47-
protected $aamFieldsExtractorHelper;
48+
private $observer;
49+
50+
/**
51+
* @var AddToCart
52+
*/
53+
private $addToCartObserver;
4854

4955
/**
5056
* Used to set the values before running a test
@@ -54,62 +60,102 @@ class AddToCartTest extends CommonTest
5460
public function setUp(): void
5561
{
5662
parent::setUp();
57-
$this->request = $this->createMock(RequestInterface::class);
58-
$this->aamFieldsExtractorHelper = new AAMFieldsExtractorHelper(
59-
$this->magentoDataHelper,
60-
$this->fbeHelper
61-
);
62-
$this->serverSideHelper = new ServerSideHelper(
63-
$this->fbeHelper,
64-
$this->aamFieldsExtractorHelper,
65-
$this->systemConfig
66-
);
67-
$this->addToCartObserver = new AddToCart(
68-
$this->fbeHelper,
69-
$this->magentoDataHelper,
70-
$this->serverSideHelper,
71-
$this->request
72-
);
63+
64+
$this->serverSideHelper = $this->getMockBuilder(ServerSideHelper::class)
65+
->disableOriginalConstructor()
66+
->getMock();
67+
$this->request = $this->getMockBuilder(RequestInterface::class)
68+
->disableOriginalConstructor()
69+
->getMockForAbstractClass();
70+
$this->escaper = $this->getMockBuilder(Escaper::class)
71+
->disableOriginalConstructor()
72+
->getMock();
73+
$this->observer = $this->getMockBuilder(Observer::class)
74+
->onlyMethods(['getData'])
75+
->disableOriginalConstructor()
76+
->getMock();
77+
78+
$this->addToCartObserver = $this->objectManager->getObject(AddToCart::class, [
79+
'fbeHelper' => $this->fbeHelper,
80+
'magentoDataHelper' => $this->magentoDataHelper,
81+
'serverSideHelper' => $this->serverSideHelper,
82+
'request' => $this->request,
83+
'escaper' => $this->escaper
84+
]);
7385
}
7486

75-
public function testAddToCartEventCreated()
87+
/**
88+
* Test execute methood
89+
*
90+
* @return void
91+
*/
92+
public function testExecute()
7693
{
77-
$id = 123;
78-
$sku = 'SKU-123';
94+
$eventId = '12ghjs-34vcv1-dfff3v-43kj97';
95+
$productId = 12;
96+
$productName = 'Test Product';
97+
$currency = 'USD';
98+
$value = 100.00;
7999
$contentType = 'product';
80-
$eventId = '1234';
81-
82-
$this->magentoDataHelper->method('getValueForProduct')->willReturn(12.99);
83-
$this->magentoDataHelper->method('getCategoriesForProduct')->willReturn('Electronics');
84-
$this->magentoDataHelper->method('getContentId')->willReturn($sku);
85-
$this->magentoDataHelper->method('getContentType')->willReturn($contentType);
86-
87-
$product = $this->objectManager->getObject('\Magento\Catalog\Model\Product');
88-
$product->setId($id)->setSku($sku);
89-
$product->setName('Earphones');
90-
$this->request->method('getParam')->willReturn($sku);
91-
$this->magentoDataHelper->method('getProductBySku')->willReturn($product);
92-
$this->magentoDataHelper->method('getProductById')->willReturn($product);
93-
94-
$observer = new Observer(['eventId' => $eventId]);
95-
96-
$this->addToCartObserver->execute($observer);
97-
98-
$this->assertEquals(1, count($this->serverSideHelper->getTrackedEvents()));
99-
100-
$event = $this->serverSideHelper->getTrackedEvents()[0];
101-
102-
$this->assertEquals($eventId, $event->getEventId());
103-
104-
$customDataArray = [
105-
'currency' => 'USD',
106-
'value' => 12.99,
107-
'content_type' => $contentType,
108-
'content_ids' => [$sku],
109-
'content_category' => 'Electronics',
110-
'content_name' => 'Earphones'
111-
];
112-
113-
$this->assertEqualsCustomData($customDataArray, $event->getCustomData());
100+
$contentIds = 'test-product';
101+
$contentCategory = 'Test Category';
102+
103+
$productMock = $this->getMockBuilder(Product::class)
104+
->disableOriginalConstructor()
105+
->getMock();
106+
107+
$this->observer->expects($this->once())
108+
->method('getData')
109+
->with('eventId')
110+
->willReturn($eventId);
111+
112+
$this->request->expects($this->once())
113+
->method('getParam')
114+
->with('product_id', null)
115+
->willReturn($productId);
116+
117+
$this->magentoDataHelper->expects($this->once())
118+
->method('getProductById')
119+
->with($productId)
120+
->willReturn($productMock);
121+
122+
$productMock->expects($this->once())
123+
->method('getId')
124+
->willReturn($productId);
125+
126+
$this->magentoDataHelper->expects($this->once())
127+
->method('getCurrency')
128+
->willReturn($currency);
129+
130+
$this->magentoDataHelper->expects($this->once())
131+
->method('getValueForProduct')
132+
->with($productMock)
133+
->willReturn($value);
134+
135+
$this->magentoDataHelper->expects($this->once())
136+
->method('getContentType')
137+
->with($productMock)
138+
->willReturn($contentType);
139+
140+
$this->magentoDataHelper->expects($this->once())
141+
->method('getContentId')
142+
->with($productMock)
143+
->willReturn($contentIds);
144+
145+
$this->magentoDataHelper->expects($this->once())
146+
->method('getCategoriesForProduct')
147+
->with($productMock)
148+
->willReturn($contentCategory);
149+
150+
$productMock->expects($this->once())
151+
->method('getName')
152+
->willReturn($productName);
153+
154+
$this->escaper->expects($this->once())
155+
->method('escapeUrl')
156+
->with($productName)
157+
->willReturn($productName);
158+
159+
$this->addToCartObserver->execute($this->observer);
114160
}
115161
}

app/code/Meta/Conversion/view/frontend/templates/pixel/view_content.phtml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ if ($block->getFacebookPixelID()) {
1212
"*": {
1313
"Meta_Conversion/js/metaPixelTracker" : {
1414
"url" : "<?= $block->escapeJs($trackerUrl); ?>",
15-
"payload": <?= json_encode([
15+
"payload": <?= $block->escapeJs(json_encode([
1616
"eventName" => $block->getEventToObserveName(),
1717
"productId" => $block->getProductId()
18-
]) ?>,
19-
"browserEventData": <?= json_encode([
18+
])) ?>,
19+
"browserEventData": <?= $block->escapeJs(json_encode([
2020
'fbAgentVersion' => $block->getFacebookAgentVersion(),
2121
'fbPixelId' => $block->getFacebookPixelID(),
2222
'source' => $block->getSource(),
@@ -26,12 +26,12 @@ if ($block->getFacebookPixelID()) {
2626
'payload' => [
2727
'content_type' => $block->getContentType(),
2828
'content_ids' => $block->getContentIDs(),
29-
'content_name' => $block->getContentName() ?? '',
29+
'content_name' => $block->escapeUrl($block->getContentName()) ?? '',
3030
'content_category' => $block->getContentCategory() ?? '',
3131
'value' => $block->getValue() ?? '',
3232
'currency' => $block->getCurrency() ?? ''
3333
]
34-
]) ?>
34+
])) ?>
3535
}
3636
}
3737
}

0 commit comments

Comments
 (0)