Skip to content

Commit 414f95b

Browse files
merge magento/2.4-develop into magento-pangolin/su-comm-test-migration-pr
2 parents 73899c3 + 5ad40fa commit 414f95b

File tree

66 files changed

+3970
-349
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+3970
-349
lines changed

app/code/Magento/Bundle/view/base/web/js/price-bundle.js

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ define([
2828
controlContainer: 'dd', // should be eliminated
2929
priceFormat: {},
3030
isFixedPrice: false,
31-
optionTierPricesBlocksSelector: '#option-tier-prices-{1} [data-role="selection-tier-prices"]'
31+
optionTierPricesBlocksSelector: '#option-tier-prices-{1} [data-role="selection-tier-prices"]',
32+
isOptionsInitialized: false
3233
};
3334

3435
$.widget('mage.priceBundle', {
@@ -53,20 +54,37 @@ define([
5354
priceBox = $(this.options.priceBoxSelector, form),
5455
qty = $(this.options.qtyFieldSelector, form);
5556

56-
if (priceBox.data('magePriceBox') &&
57-
priceBox.priceBox('option') &&
58-
priceBox.priceBox('option').priceConfig
59-
) {
60-
if (priceBox.priceBox('option').priceConfig.optionTemplate) {
61-
this._setOption('optionTemplate', priceBox.priceBox('option').priceConfig.optionTemplate);
57+
this._updatePriceBox();
58+
priceBox.on('price-box-initialized', this._updatePriceBox.bind(this));
59+
options.on('change', this._onBundleOptionChanged.bind(this));
60+
qty.on('change', this._onQtyFieldChanged.bind(this));
61+
},
62+
63+
/**
64+
* Update price box config with bundle option prices
65+
* @private
66+
*/
67+
_updatePriceBox: function () {
68+
var form = this.element,
69+
options = $(this.options.productBundleSelector, form),
70+
priceBox = $(this.options.priceBoxSelector, form);
71+
72+
if (!this.options.isOptionsInitialized) {
73+
if (priceBox.data('magePriceBox') &&
74+
priceBox.priceBox('option') &&
75+
priceBox.priceBox('option').priceConfig
76+
) {
77+
if (priceBox.priceBox('option').priceConfig.optionTemplate) { //eslint-disable-line max-depth
78+
this._setOption('optionTemplate', priceBox.priceBox('option').priceConfig.optionTemplate);
79+
}
80+
this._setOption('priceFormat', priceBox.priceBox('option').priceConfig.priceFormat);
81+
priceBox.priceBox('setDefault', this.options.optionConfig.prices);
82+
this.options.isOptionsInitialized = true;
6283
}
63-
this._setOption('priceFormat', priceBox.priceBox('option').priceConfig.priceFormat);
64-
priceBox.priceBox('setDefault', this.options.optionConfig.prices);
84+
this._applyOptionNodeFix(options);
6585
}
66-
this._applyOptionNodeFix(options);
6786

68-
options.on('change', this._onBundleOptionChanged.bind(this));
69-
qty.on('change', this._onQtyFieldChanged.bind(this));
87+
return this;
7088
},
7189

7290
/**

app/code/Magento/Catalog/view/base/web/js/price-box.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ define([
4949

5050
box.on('reloadPrice', this.reloadPrice.bind(this));
5151
box.on('updatePrice', this.onUpdatePrice.bind(this));
52+
box.trigger('price-box-initialized');
5253
},
5354

5455
/**

app/code/Magento/Catalog/view/frontend/web/template/product/image_with_borders.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
-->
77
<span class="product-image-container" data-bind="style: {width: width + 'px'}">
88
<span class="product-image-wrapper" data-bind="style: {'padding-bottom': height/width*100 + '%'}">
9-
<img class="product-image-photo" data-bind="attr: {src: src, alt: alt}, style: {width: width + 'px', height: height + 'px'}" />
9+
<img class="product-image-photo" data-bind="attr: {src: src, alt: alt}, style: {width: 'auto', height: 'auto'}" />
1010
</span>
1111
</span>

app/code/Magento/CatalogGraphQl/Model/Resolver/Product/EntityIdToId.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public function resolve(
5353
$product = $value['model'];
5454

5555
$productId = $product->getData(
56-
$this->metadataPool->getMetadata(ProductInterface::class)->getLinkField()
56+
$this->metadataPool->getMetadata(ProductInterface::class)->getIdentifierField()
5757
);
5858

5959
return $productId;

app/code/Magento/CatalogGraphQl/etc/schema.graphqls

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ interface ProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\
100100
created_at: String @doc(description: "Timestamp indicating when the product was created.")
101101
updated_at: String @doc(description: "Timestamp indicating when the product was updated.")
102102
country_of_manufacture: String @doc(description: "The product's country of origin.")
103-
type_id: String @doc(description: "One of simple, virtual, bundle, downloadable, grouped, or configurable.")
104-
websites: [Website] @doc(description: "An array of websites in which the product is available.") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Websites")
103+
type_id: String @doc(description: "One of simple, virtual, bundle, downloadable, grouped, or configurable.") @deprecated(reason: "Use __typename instead.")
104+
websites: [Website] @doc(description: "An array of websites in which the product is available.") @deprecated(reason: "The field should not be used on the storefront.") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Websites")
105105
product_links: [ProductLinksInterface] @doc(description: "An array of ProductLinks objects.") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\BatchProductLinks")
106106
media_gallery_entries: [MediaGalleryEntry] @deprecated(reason: "Use product's `media_gallery` instead") @doc(description: "An array of MediaGalleryEntry objects.") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\MediaGalleryEntries")
107107
price: ProductPrices @deprecated(reason: "Use price_range for product price information.") @doc(description: "A ProductPrices object, indicating the price of an item.") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Price")
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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\CatalogSearch\Model\Search\FilterMapper;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\CatalogSearch\Model\Adapter\Mysql\Filter\AliasResolver;
12+
use Magento\Eav\Model\Config as EavConfig;
13+
use Magento\Framework\DB\Select;
14+
use Magento\Framework\Search\Request\FilterInterface;
15+
16+
/**
17+
* Add stock status filter for each requested filter
18+
*/
19+
class CustomAttributeStockStatusFilter
20+
{
21+
/**
22+
* Suffix to append to filter name in order to generate stock status table alias for JOIN clause
23+
*/
24+
private const STOCK_STATUS_TABLE_ALIAS_SUFFIX = '_stock_index';
25+
/**
26+
* Attribute types to apply
27+
*/
28+
private const TARGET_ATTRIBUTE_TYPES = [
29+
'select',
30+
'multiselect'
31+
];
32+
/**
33+
* @var EavConfig
34+
*/
35+
private $eavConfig;
36+
/**
37+
* @var AliasResolver
38+
*/
39+
private $aliasResolver;
40+
/**
41+
* @var StockStatusQueryBuilder|null
42+
*/
43+
private $stockStatusQueryBuilder;
44+
45+
/**
46+
* @param EavConfig $eavConfig
47+
* @param AliasResolver $aliasResolver
48+
* @param StockStatusQueryBuilder $stockStatusQueryBuilder
49+
*/
50+
public function __construct(
51+
EavConfig $eavConfig,
52+
AliasResolver $aliasResolver,
53+
StockStatusQueryBuilder $stockStatusQueryBuilder
54+
) {
55+
$this->eavConfig = $eavConfig;
56+
$this->aliasResolver = $aliasResolver;
57+
$this->stockStatusQueryBuilder = $stockStatusQueryBuilder;
58+
}
59+
60+
/**
61+
* Apply stock status filter to provided filter
62+
*
63+
* @param Select $select
64+
* @param mixed $values
65+
* @param FilterInterface[] $filters
66+
* @return Select
67+
*/
68+
public function apply(Select $select, $values = null, FilterInterface ...$filters): Select
69+
{
70+
$select = clone $select;
71+
foreach ($filters as $filter) {
72+
if ($this->isApplicable($filter)) {
73+
$mainTableAlias = $this->aliasResolver->getAlias($filter);
74+
$stockTableAlias = $mainTableAlias . self::STOCK_STATUS_TABLE_ALIAS_SUFFIX;
75+
$select = $this->stockStatusQueryBuilder->apply(
76+
$select,
77+
$mainTableAlias,
78+
$stockTableAlias,
79+
'source_id',
80+
$values
81+
);
82+
}
83+
}
84+
return $select;
85+
}
86+
87+
/**
88+
* Check if stock status filter is applicable to provided filter
89+
*
90+
* @param FilterInterface $filter
91+
* @return bool
92+
*/
93+
private function isApplicable(FilterInterface $filter): bool
94+
{
95+
$attribute = $this->eavConfig->getAttribute(Product::ENTITY, $filter->getField());
96+
return $attribute
97+
&& $filter->getType() === FilterInterface::TYPE_TERM
98+
&& in_array($attribute->getFrontendInput(), self::TARGET_ATTRIBUTE_TYPES, true);
99+
}
100+
}

app/code/Magento/CatalogSearch/Model/Search/FilterMapper/FilterMapper.php

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99
use Magento\CatalogSearch\Model\Search\SelectContainer\SelectContainer;
1010
use Magento\CatalogSearch\Model\Adapter\Mysql\Filter\AliasResolver;
1111
use Magento\CatalogInventory\Model\Stock;
12+
use Magento\Framework\App\ObjectManager;
1213

1314
/**
14-
* Class FilterMapper
1515
* This class applies filters to Select based on SelectContainer configuration
1616
*
17-
* @deprecated
17+
* @deprecated MySQL search engine is not recommended.
1818
* @see \Magento\ElasticSearch
19+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1920
*/
2021
class FilterMapper
2122
{
@@ -43,31 +44,38 @@ class FilterMapper
4344
* @var StockStatusFilter
4445
*/
4546
private $stockStatusFilter;
47+
/**
48+
* @var CustomAttributeStockStatusFilter
49+
*/
50+
private $customAttributeStockStatusFilter;
4651

4752
/**
4853
* @param AliasResolver $aliasResolver
4954
* @param CustomAttributeFilter $customAttributeFilter
5055
* @param FilterStrategyInterface $filterStrategy
5156
* @param VisibilityFilter $visibilityFilter
5257
* @param StockStatusFilter $stockStatusFilter
58+
* @param CustomAttributeStockStatusFilter|null $customAttributeStockStatusFilter
5359
*/
5460
public function __construct(
5561
AliasResolver $aliasResolver,
5662
CustomAttributeFilter $customAttributeFilter,
5763
FilterStrategyInterface $filterStrategy,
5864
VisibilityFilter $visibilityFilter,
59-
StockStatusFilter $stockStatusFilter
65+
StockStatusFilter $stockStatusFilter,
66+
?CustomAttributeStockStatusFilter $customAttributeStockStatusFilter = null
6067
) {
6168
$this->aliasResolver = $aliasResolver;
6269
$this->customAttributeFilter = $customAttributeFilter;
6370
$this->filterStrategy = $filterStrategy;
6471
$this->visibilityFilter = $visibilityFilter;
6572
$this->stockStatusFilter = $stockStatusFilter;
73+
$this->customAttributeStockStatusFilter = $customAttributeStockStatusFilter
74+
?? ObjectManager::getInstance()->get(CustomAttributeStockStatusFilter::class);
6675
}
6776

6877
/**
69-
* Applies filters to Select query in SelectContainer
70-
* based on SelectContainer configuration
78+
* Applies filters to Select query in SelectContainer based on SelectContainer configuration
7179
*
7280
* @param SelectContainer $selectContainer
7381
* @return SelectContainer
@@ -79,22 +87,22 @@ public function applyFilters(SelectContainer $selectContainer)
7987
{
8088
$select = $selectContainer->getSelect();
8189

82-
if ($selectContainer->hasCustomAttributesFilters()) {
83-
$select = $this->customAttributeFilter->apply($select, ...$selectContainer->getCustomAttributesFilters());
84-
}
85-
86-
$filterType = StockStatusFilter::FILTER_JUST_ENTITY;
87-
if ($selectContainer->hasCustomAttributesFilters()) {
88-
$filterType = StockStatusFilter::FILTER_ENTITY_AND_SUB_PRODUCTS;
89-
}
90-
9190
$select = $this->stockStatusFilter->apply(
9291
$select,
9392
Stock::STOCK_IN_STOCK,
94-
$filterType,
93+
StockStatusFilter::FILTER_JUST_ENTITY,
9594
$selectContainer->isShowOutOfStockEnabled()
9695
);
9796

97+
if ($selectContainer->hasCustomAttributesFilters()) {
98+
$select = $this->customAttributeFilter->apply($select, ...$selectContainer->getCustomAttributesFilters());
99+
$select = $this->customAttributeStockStatusFilter->apply(
100+
$select,
101+
$selectContainer->isShowOutOfStockEnabled() ? null : Stock::STOCK_IN_STOCK,
102+
...$selectContainer->getCustomAttributesFilters()
103+
);
104+
}
105+
98106
$appliedFilters = [];
99107

100108
if ($selectContainer->hasVisibilityFilter()) {

0 commit comments

Comments
 (0)