Skip to content

Commit c877a8b

Browse files
authored
INT-287: Add Recently viewed component
Add Recently viewed component and update webcomponents library to version 5.2.1
1 parent 07d7096 commit c877a8b

9 files changed

Lines changed: 115 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
### Add
44
- Add support for Magento v2.4.9
55
- Add support for PHP 8.4
6+
- Add Recently viewed component
67

78
### Update
8-
- Update WebComponents library to version 5.1.7
9+
- Update WebComponents library to version 5.2.1
910
- Add template to suggest element
1011

1112
## [v5.2.1] - 2025.07.17

src/ViewModel/ProductBasedComponent.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Magento\Catalog\Api\Data\ProductInterface;
88
use Magento\Catalog\Helper\Image;
9+
use Magento\Catalog\Helper\ImageFactory;
910
use Magento\Framework\App\Config\ScopeConfigInterface;
1011
use Magento\Framework\Registry;
1112
use Magento\Framework\UrlInterface;
@@ -22,6 +23,7 @@ public function __construct(
2223
private readonly ScopeConfigInterface $scopeConfig,
2324
private readonly UrlInterface $urlBuilder,
2425
private readonly Registry $registry,
26+
private readonly ImageFactory $imageHelperFactory
2527
) {
2628
}
2729

@@ -57,4 +59,15 @@ public function isSsrEnable(): bool
5759
{
5860
return (bool) $this->scopeConfig->isSetFlag(self::PATH_USE_SRR);
5961
}
62+
63+
public function getImageUrl($product): string
64+
{
65+
if (!$product) {
66+
return '';
67+
}
68+
69+
$imageHelper = $this->imageHelperFactory->create();
70+
71+
return $imageHelper->init($product, 'product_small_image')->getUrl();
72+
}
6073
}

src/etc/adminhtml/system/components.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
<label>Popular searches</label>
5252
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
5353
</field>
54+
55+
<field id="recently_viewed" translate="label" type="select" sortOrder="11" showInDefault="1" showInWebsite="1" showInStore="1">
56+
<label>Recently Viewed Products</label>
57+
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
58+
</field>
5459
</group>
5560
<group id="components_options" translate="label comment" sortOrder="41" showInDefault="1" showInWebsite="1" showInStore="1">
5661
<label>Custom Elements Options</label>

src/etc/config.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<similar_products>1</similar_products>
2323
<paging>1</paging>
2424
<popular_searches>1</popular_searches>
25+
<recently_viewed>0</recently_viewed>
2526
</components>
2627
<data_transfer>
2728
<ff_password backend_model="Magento\Config\Model\Config\Backend\Encrypted" />

src/i18n/de_DE.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ No,Nein
2424
"Show","Zeige"
2525
"products per page","Artikel pro Seite"
2626
Recommendations,"Empfohlene Produkte"
27+
"Recently Viewed Products","Zuletzt angesehene Produkte"
2728
"Add to Cart","In den Warenkorb"
2829
"{{totalHits}} Items","{{totalHits}} Artikel"
2930
Search…,Suchen…

src/view/frontend/layout/catalog_product_view.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
<argument name="view_model" xsi:type="object">Omikron\Factfinder\ViewModel\ProductBasedComponent</argument>
2323
</arguments>
2424
</block>
25+
<block class="Magento\Framework\View\Element\Template" name="factfinder.recently_viewed" ifconfig="factfinder/components/recently_viewed" template="Omikron_Factfinder::ff/recently_viewed.phtml">
26+
<arguments>
27+
<argument name="view_model" xsi:type="object">Omikron\Factfinder\ViewModel\ProductBasedComponent</argument>
28+
</arguments>
29+
</block>
2530
</referenceContainer>
2631

2732
<referenceBlock name="factfinder.feedbacktext">
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
/** @var Magento\Framework\View\Element\Template $block */
3+
/** @var ?Omikron\Factfinder\ViewModel\ProductBasedComponent $viewModel */
4+
/** @var Magento\Framework\Escaper $escaper */
5+
$viewModel = $block->getViewModel();
6+
$product = $viewModel->getProduct();
7+
8+
if (!$product || !$product->getId()) {
9+
return;
10+
}
11+
12+
$masterProductNumber = $product->getSku();
13+
14+
if ($product->getTypeId() === \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
15+
$masterProductNumber = $product->getData('sku');
16+
}
17+
18+
$imageUrl = $viewModel->getImageUrl($product);
19+
?>
20+
21+
<script>
22+
document.addEventListener('ffCoreReady', ({ factfinder }) => {
23+
factfinder.components.recentlyViewed.config({
24+
maxLength: 9,
25+
});
26+
27+
factfinder.components.recentlyViewed.addEntry({
28+
Name: '<?= $escaper->escapeJs($product->getName()) ?>',
29+
Master: '<?= $escaper->escapeJs($masterProductNumber) ?>',
30+
ProductNumber: '<?= $escaper->escapeJs($product->getSku()) ?>',
31+
Deeplink: '<?= $escaper->escapeJs($product->getProductUrl()) ?>',
32+
Price: <?= (float) $product->getFinalPrice() ?>,
33+
ImageUrl: '<?= $escaper->escapeJs($imageUrl) ?>',
34+
});
35+
});
36+
</script>
37+
38+
39+
<ff-recently-viewed wait-for-update>
40+
<div class="block upsell">
41+
<div class="block-title title">
42+
<strong role="heading" aria-level="2"><?= $escaper->escapeHtml(__('Recently Viewed Products')) ?></strong>
43+
</div>
44+
<div class="block-content content">
45+
46+
<ff-record-list class="products list items product-items" subscribe="false" unresolved>
47+
<template data-role="record">
48+
<ff-record class="item product product-item">
49+
<div class="product-item-info" data-container="product-grid">
50+
<a class="product-image-container" data-redirect="{{Deeplink}}" data-anchor="{{Deeplink}}" data-redirect-target="_self">
51+
<span class="product-image-wrapper">
52+
<img class="product-image-photo" data-image="{{ImageUrl}}" alt="{{Name}}"/>
53+
</span>
54+
</a>
55+
56+
<div class="product details product-item-details">
57+
<div class="product name product-item-name">{{Name}}</div>
58+
<div class="price-box price-final_price" data-role="priceBox">
59+
<span class="price-container price-final_price tax weee">
60+
<span data-price-amount="{{masterValues.Price}}" data-price-type="finalPrice" class="price-wrapper">
61+
<span class="price">{{$ Price}}</span>
62+
</span>
63+
</span>
64+
</div>
65+
</div>
66+
</div>
67+
</ff-record>
68+
</template>
69+
</ff-record-list>
70+
71+
</div>
72+
</div>
73+
</ff-recently-viewed>

src/view/frontend/web/ff-web-components/bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/view/frontend/web/ff-web-components/default-styles.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,13 @@ ff-similar-products {
274274
}
275275

276276

277+
/* ---- ff-recently-viewed ---- */
278+
279+
ff-recently-viewed {
280+
display: block;
281+
}
282+
283+
277284
/* ---- ff-onfocus-suggest ---- */
278285

279286
ff-onfocus-suggest {
@@ -727,6 +734,13 @@ ff-slider .ffw-slider-button-right {
727734
transform: translate(0, -50%);
728735
}
729736

737+
/* Hidden visibility is important to take nested elements out of the tabindex chain when group is collapsed.
738+
`display:none` cannot be used because it breaks the recalculation of the slider's position. */
739+
ff-asn-group .ffw-wrapper:not([opened]),
740+
ff-asn-group-slider .ffw-wrapper:not([opened]) {
741+
visibility: hidden;
742+
}
743+
730744
ff-asn-remove-all-filters {
731745
display: inline-block;
732746
}

0 commit comments

Comments
 (0)