Security patch available
Merchants can now install time-sensitive security fixes without applying the hundreds of functional fixes and enhancements that a full quarterly release provides (for example, 2.4.1-p1). Patch 2.4.0.12 (Composer package 2.4.1-p1) is a security patch that provides fixes for vulnerabilities that have been identified in our previous quarterly release, 2.4.1. All hot fixes that were applied to the 2.4.1 release are included in this security patch. (A hot fix provides a fix to a released version that addresses a specific problem or bug.)
For general information about security patches, see Introducing the New Security Patch Release. For instructions on downloading and applying security patches (including patch 2.4.1-p1), see Quick start on-premises installation. Security patches include security bug fixes only, not the additional security enhancements that are included in the full patch.
Other release information
Although code for these features is bundled with quarterly releases , several of these projects (for example, Progressive Web Applications (PWA) Studio) are also released independently. Bug fixes for these projects are documented in the separate, project-specific release information that is available in the documentation for each project.
Highlights
Look for the following highlights in this release.
Substantial security enhancements
This release includes over 35 security fixes and platform security improvements. All security fixes have been backported to 2.4.1-p1 and 2.3.6-p1.
Over 35 security enhancements that help close remote code execution (RCE) and cross-site scripting (XSS) vulnerabilities
No confirmed attacks related to these issues have occurred to date. However, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. Most of these issues require that an attacker first obtains access to the Admin. As a result, we remind you to take all necessary steps to protect your Admin, including but not limited to these efforts: IP allowlisting, two-factor authentication, use of a VPN, the use of a unique location rather than /admin
, and good password hygiene. See Adobe Security Bulletin for a discussion of these fixed issues.
Additional security enhancements
Security improvements for this release include:
-
All core cookies now support the
SameSite
attribute. -
The application now displays messages that identify potentially malicious content in product and category description fields when the user tries to save values in these fields.
-
File system operations across components have been standardized and hardened to prevent malicious uploads.
-
Core Content Security Policy (CSP) violations have been fixed.
Infrastructure improvements
This release contains enhancements to core quality, which improve the quality of the Framework and these functional areas: Customer Account, Catalog, CMS, OMS, Import/Export, Promotions and Targeting, and Cart and Checkout.
Platform enhancements
-
Elasticsearch 7.9.x is now supported. Although we recommend running Elasticsearch 7.9.x, version 2.4.x remains compatible with Elasticsearch 7.4.x.
-
2.4.2 has been tested with Varnish 6.4. Version 2.4.x remains compatible with Varnish 6.x.
-
Redis 6.x is now supported. Version 2.4.x remains compatible with Redis 5.x.
-
2.4.2 is now compatible with Composer 2.x. We recommend that merchants migrate to Composer 2.x. Although you can install this release using Composer 1.x, Composer 1.x will soon reach end-of-life. For an overview of Composer 2.x features, see Composer 2.0 is now available!
The ability to configure an installation to use a split database has been deprecated in this release. Merchants who currently use split database should start planning to revert to or migrate to a single database or use an alternative approach. See the Deprecation of split database functionality in Magento Open Source DevBlog post for an overview of this issue. See Revert from a split database to a single database for migration instructions.
Performance enhancements
This release includes code enhancements that boost API performance and Admin response time for deployments with large catalogs. Multiple scalability enhancements enable 2.4.2 to natively support complex catalogs up to 20x larger than in previous releases.
Adobe Stock Integration
This release includes Adobe Stock Integration v2.1.1.
GraphQL
This release adds GraphQL coverage for the following features:
-
Added support for comparison lists. Shoppers can create and delete comparison lists, and add and remove items to the comparison lists. In addition, shoppers that create a compare list as a guest can log in as a customer and retain their comparison lists.
-
Added the
generateCustomerTokenAsAdmin
mutation and updated theCustomer
object to support remote purchasing assistance. -
Added localization support across stores to support tasks such as changing languages, carts, and currencies.
-
Added support for unions in GraphQL. GitHub-29425
-
The GraphQL schema has been enhanced to optimize product data retrieval for configurable products with many variants.
-
Integer type object IDs have been deprecated in favor of
uid
attributes of type ID. -
Added the
staging
attribute to theProductInterface
andCategoryInterface
to determine if a product is staged and to view its associated campaign information.
See the GraphQL Developer Guide for details on these enhancements.
PWA Studio
This release of PWA Studio includes:
-
Internationalization and localization. Venia now provides support for multiple languages and currencies.
-
Improved extensibility framework to support code changes through extensions.
-
Initial components for My Account related features such as Wishlist, Saved Payments, Address Book, and Order History.
-
Various performance optimizations and bug fixes.
For information about enhancements and bug fixes, see PWA Studio releases. See compatibility for a list of PWA Studio versions and their compatible versions.
Media Gallery
New Role Resources for Media Gallery. This release provides merchants the ability to limit administrator access to only the Media gallery and to control who can perform these actions:
-
Insert media assets into content
-
Upload assets
-
Edit assets details
-
Delete assets from the Media Gallery
-
Manage folder structure.
Web-optimized images in content. Merchants can now use web-optimized image rendition in content instead of high resolution images. The original image remains unmodified in the Media Gallery, and the image rendition is dynamically generated when the image is inserted in the content.
Functional Testing Framework (MFTF)
MFTF 3.2.1 is now available. This release introduces error tolerance in both tests and test suite generation. Additional enhancements and bug fixes are described in the Functional Testing Framework Changelog.
Vendor Developed Extensions
See the following articles for updates on features and changes for this release:
AWS S3 support enhancements
Amazon Simple Storage Service (AWS S3) support has been enhanced to include support for:
-
Object storage and future extensibility
-
Storing media files on AWS S3
Fixed issues
We have fixed hundreds of issues in the 2.4.2 core code.
Installation, upgrade, deployment
- The ability to configure an installation to use a split database has been deprecated in this release. See the Deprecation of split database functionality in Magento Open Source DevBlog post.
- Merchants can now successfully upgrade an Open Source deployment that runs MySQL 8.x to a Commerce deployment. Previously, the application threw an exception when
AUTO_INCREMENT
values reverted to initial values for all tables whererow_id
was added during upgrade.
- The application now displays an error message that identifies the path that was used to create the patch if an error occurs when running
bin/magento/setup:db:generate-patch
. GitHub-27523
block_html
,full_page
, andlayout
caches are now disabled as expected afterbin/magento/setup:upgrade
execution. GitHub-28186
- The minimum required PHP version in
bootstrap.php
has been updated. GitHub-30004
- You can now execute
bin/magento/setup:upgrade
after installing sample data. Previously, when you tried to executebin/magento/setup:upgrade
, the application displayed this error:unable to apply data patch magento\catalogrulesampledata\setup\patch\data\installcatalogrulesampledata for module magento_catalogrulesampledata
. The application also displayed this error in the system log:main.ERROR: Sample Data error: Unable to unserialize value. Error: Syntax error
. GitHub-30685
- You can now set a YouTube API key from the command line as expected. Previously, the applicationreturned this error when you tried to execute
bin/magento config:sensitive:set catalog/product_video/youtube_api_key
:There are no sensitive configurations to fill
.
- The application now honors the
maxMessages
values that are defined inqueue_consumer.xml
. Previously, the applicationused only the deployment configuration values. GitHub-29522
- URL generation for a new store now works as expected when the store is created using
bin/magento setup:config:import
. Previously, URL rewrites were not generated in production environments. GitHub-30025
- The application no longer throws an error when you try to change
backend-frontname
using thessh
container after installing Magento Open Source. GitHub-26762
- The application no longer displays this question when you run
bin/magento setup:install
to connect to existing database:Overwrite the existing configuration for db-ssl-verify?[Y/n]
. GitHub-29612
Adobe Stock Integration
- Added support for reading
exif_image.png
orexif-image.jpeg
metadata. GitHub-1449
- The content displayed when you click the Default View bookmark for the Media Gallery is no longer filtered. Previously, the default view contained a filter that was applied from
url-filter
applier. GitHub-1813, GitHub-1789, GitHub-1780
- Logic has been removed from the WYSIWYG OnInsert controller (
Magento\Cms\Controller\Adminhtml\Wysiwyg\Images\OnInsert::execute()
) and added to theModel\Wysiwyg\Images\PrepareImage::execute()
model. GitHub-1504
- Area emulation has been removed from the
media-content:sync
command (\Magento\MediaContentSynchronization\Console\Command\Synchronize::execute
). GitHub-1784
Analytics
- Advanced Reporting now works as expected for multiple environments in the same domain. Previously, CSV files that were generated by Advanced Reporting failed because double quotes were escaped with backslashes rather than with another double quote as required by CSV standard RFC4180.
- The
analytics_collect_data
job now runs successfully when using either the default or non-default port to connect to MySQL inenv.php
. Previously,analytics_collect_data
threw an error when you used the non-default port.
- CSV files that are generated by
analytics_collect_data
are now properly escaped. Previously, these files were not generated with the correct escaping, which prevented the generation of Inventory reports.
Braintree
-
Shoppers can now use Apple Pay to successfully place an order for virtual products. Previously, the application threw this error:
There are no shipping methods available for you right now. Please try again or use an alternative payment method
. -
The default PayPal Express Checkout payment method now works as expected with the Braintree Credit Card payment method. Previously, the application did not display the PayPal button when the Braintree Credit Card payment method was enabled.
Bundle products
- The application no longer sets prices for fixed-price bundle product child items in quotes.
- Price sorting now works as expected when bundle products include out-of-stock products. Previously, sorting price in descending order did not display products in order of decreasing price.
- The application now automatically applies a default quantity of 1 for bundle product options when many options exist. Previously, merchants had to manually assign a default quantity to each option.
- The order invoice create page now displays the child products for bundle products as expected. GitHub-27350
- The application now assigns correct product prices when you re-order simple products that are part of a bundle product with a custom price. Previously, setting a custom price on a bundle product resulted in incorrect prices on attached simple products when reordered. GitHub-30343
- Calling POST
/V1/order/{orderId}/ship
to ship an order that contains a bundle product now marks the order as complete as expected. Previously, the application displayed this error message:You can't create a shipment without products
. GitHub-9762
Cart and checkout
- The shipping method estimator now works as expected when custom address attributes are present on the shipping step of the checkout workflow. Previously, the application displayed this error message:
{"message":"Error occurred during \"custom_attributes\" processing. A custom attribute is specified with a missing attribute code. Verify the code and try again."}
GitHub-27505
- The application now displays the
You have no items in your shopping cart
message in the mini cart as expected when a shopper removes the only item in their cart. Previously, cart data was not updated forcheckout/cart/removeFailed
when a shopper removed the single item, and the application displayed this message:1 product requires your attention
.
- The application no longer displays the cost of shipping for an order for a non-applicable shipping method. Previously, the application displayed a price of 0 for a non-applicable shipping method in the checkout workflow.
- A customer’s default billing address is now selected when the My billing and shipping address are the same checkbox on the checkout workflow is unselected.
- Cart contents are no longer lost when a shopper switches from one store to another in a different domain.
- Shoppers can now successfully complete an order using Check Out with Multiple Addresses when using multiple shipping methods. Previously, the application displayed this error:
There has been an error processing your request
. GitHub-30197
- The application now displays the correct default country on the shipping page of the checkout workflow when the shopper changes the store view from the shopping cart.
- The application now excludes the current session when cleaning up customer sessions after a post-logout password reset when a guest shopper is logged in. Previously, the applicationemptied the shopping cart when the shopper reset their password.
- The application now displays the correct default country for a store view when a shopper changes the store view in the shopping cart. Previously, when the store view was changed in the cart, the default country was incorrect.
- Redundant calls to the
/rest/V1/guest-carts/cart_id/totals-information
endpoint on the cart have been removed, which has improved cart performance. Previously, when a shopper added a product to the cart and then subsequently viewed the cart, the application called thecollectAddressTotals
method multiple times.
- The application no longer displays the Region field for a country in the checkout workflow when the Allow to Choose State if It is Optional for Country setting is disabled. GitHub-30747
- The application no longer repeats a shipping address in the storefront checkout workflow when an order is re-ordered from the Admin.
- Corrected problems with the design of
AdminMediaGalleryInsertLargeImageFileSizeTest
.
- All new records in the
quote
table for guests are now assigned a value of 1 in thecustomer_is_guest field
. Previously, for each new guest who added a product into cart, the record was assigned a 0 in thequote.customer_is_guest
field.
- The Submit button on the Review & Payments section of the checkout workflow has been moved to inside
<form id="purchaseorder-form"...></form>
, which makes implicit form submission possible without altering any JavaScript. GitHub-27925
- The application no longer displays the Region field on the checkout workflow when the Allow to Choose State if It is Optional for Country setting is disabled. GitHub-30747
- The application now correctly updates a cart’s item subtotal when a shopper clicks Update Shopping Cart while checking out with multiple addresses. GitHub-30408
- The application no longer throws an exception when
config.xml
nodes exist for payment methods that are not currently installed. Previously, the application threw an exception during checkout. GitHub-29555
- The application now renders product names that contain special characters correctly in the mini cart. GitHub-29075
- The application now sets the correct discount package for table rate. Previously, the application did not apply a cart rule that set a discount on the cart when it calculated table rate. GitHub-30169
Cart price rule
- Cart price rules are now applied as expected when order subtotals are calculated without incorporating tax. The new
Subtotal (Incl. Tax)
option has been added as a cart price rule condition.
- Applying a price rule with a coupon using GraphQL now works as expected when the Fixed amount discount for whole cart action is used.
Catalog
- The application now displays all re-enabled products in the storefront as expected. Previously, when a product was disabled and then re-enabled, the application did not display the product until the Varnish page cache was cleared or the store re-indexed because the page cache was not invalidated after re-enabling a product.
- Partial re-indexing of large catalogs now works as expected. Previously, products randomly disappeared from the storefront category page during re-indexing with the
catalogsearch_fulltext
partial indexer.
- Shoppers can now re-order an invoiced order of a product with customizable options as expected. Previously, the application threw this error when a shopper tried to re-order:
{"0":"The product's required option(s) weren't entered. Make sure the options are entered and try again
.
- You can now successfully set the Layout setting on the Category Design page to No layout updates. Previously, the applicationreverted to Category - FullWidth when you assigned the No layout updates value.
- Problems with product sort order on the storefront have been resolved. Previously, when the application indexed product prices, it occasionally set a configurable product’s
min_price
andmax_price
to 0 in thecatalog_product_index_price
table, which affected price sort order on the storefront.
- The application now successfully updates attributes that are labeled
Product Type
. Previously, because theproduct_type
attribute was reserved in the code, the application displayed this message when you tried to update aProduct Type
attribute:An attribute with the same code (product_type) already exists.
- The application no longer changes the position of an uploaded video in the Images and Videos section of the product details page when you save the product. Previously, the new image position was assigned an index value (position in the list) and if existing image positions were not aligned with their indices values, the new image was misplaced in the list.
- The Add to Cart functionality now works as expected whenever the Add to Cart button is available to click. Previously, if you clicked this button multiple times while waiting for a product page to load, the application threw this error:
Invalid Form Key. Please refresh the page
.
- The application no longer flushes category cache when a merchant adds or removes disabled products to or from a category. Previously, the applicationflushed the cache for related categories despite product status. Categories were also unassigned when a category was saved, which led to flushing of category cache.
- Catalog product filtering within the All store view scope now works correctly. Previously, products with a status of either
Enabled
orDisabled
were displayed in the grid while filtering only enabled or disabled products.
- Partial re-indexing no longer results in missed products and empty categories.
- Re-order now works as expected when Use JavaScript Calendar is enabled (Stores > Configuration > Catalog > Date & Time Custom Options). Previously, when this setting was enabled, the application displayed this error when you tried to re-order the previously placed order from the Admin:
Please specify date required option(s)
.
- The application now displays the correct currency in multi-site deployments during tier price creation.
- Product image custom attributes are now correctly escaped. The
data-src
attribute has the same value assrc
attribute, as expected. Previously, URL special symbols were escaped.
- Updating a category through the REST API no longer disables the Use Default Value setting on the Enable Category, Include in Menu, and URL Key attributes.
- Saving a category now flushes only the block cache that is related to this category. Previously, the applicationflushed the cache for all category blocks.
- The price of a custom option with a percent price is now converted as expected into the active store’s base currency in multi-store deployments. Previously, the price of a custom option with a percent price was converted incorrectly. GitHub-26432
- The application now recreates images successfully, and these images are visible in the Admin as expected whenever a merchant sends media gallery data using POST
rest/all/V1/products
. Previously, the applicationrecreated the images but deleted them when a merchant sent media gallery data via POSTrest/all/V1/products
if the images were deleted inpub/media
but there were still records in media still contained records for these images. As a result, the merchant saw only placeholders in the Admin because the images were created and deleted during the update process.
- Records are now deleted as expected when you unassigned an item from a website. Previously, images were duplicated when POST
rest/all/V1/products
was executed.
- The
/V1/categories/{categoryId}/products
call now returns a list of all products that belong to the parent category as expected. Previously, if a product belonged to more than one subcategory of the parent category, the application threw this type of error:Internal Error. Details are available in the application log file. Report ID: webapi-5f8579e37db54
. GitHub-30461
- The
/V1/products/attributes/:attributeCode/options
REST endpoint now supports updating an existing attribute option.
- The price of a custom option with a percent price is now converted as expected into the active store’s base currency in multi-store deployments. Previously, the price of a custom option with a percent price was converted incorrectly. GitHub-26432
- Merchants can now successfully save a new attribute during product creation. Previously, the application did not save the attribute and redirected the merchant to the store view home page when they tried to save the attribute. GitHub-30362
- The product grids on the Sales > Orders and Catalog > Products pages now list all relevant stores, not just the most recently created store. GitHub-29267
- Product repository now uses
store_id
when available to save attribute values for an existing product. Previously, the product repository class overrode the product store ID and always assigned the default store ID. GitHub-29933
Catalog Rule
- Catalog price rules now work as expected with custom options on product detail pages. Previously, product prices on that page did not reflect applicable catalog price rules. GitHub-22856
- Product and catalog caches now expire as scheduled. Previously, caches expired daily because
сron
ran thecatalogrule_apply_all
task once daily, which re-indexed all catalog rules and dependent indexers, and cleared the cache for all products and categories.
Cleanup
Typo and grammar cleanup
- The title of the Order Failure page has been revised for accuracy. Previously, this page was titled: We received your order!. GitHub-29416
- Removed unnecessary spaces in
app/code/Magento/Contact/view/frontend/templates/form.phtml
. GitHub-29779
- Corrected a typo in the help message for the
bin/magento/setup:config:set
subcommand. GitHub-28802
- Corrected grammar in the PHPDoc for the
framework/Registry.php
file. GitHub-29661
- Removed extraneous whitespace from
app/code/Magento/Catalog/Helper/Product/View.php
. GitHub-30601
- Corrected a typo in a function name in
app/code/Magento/Ui/view/base/web/js/form/element/ui-select.js
. GitHub-29987
- Corrected the pluralization of “item” in the mini cart and checkout order summary. GitHub-29920
- Removed whitespace in inline elements in markup layered navigation filters. GitHub-30448
rl
has been corrected tourl
in\Magento\Framework\Filter\Template\Tokenizer\Parameter
. GitHub-29185
Code cleanup
- An extraneous HTML
<br>
tag has been removed from the Check Data message area of the System > Import page.
ChangeQuoteControl
has been refactored. GitHub-29673
AccessChangeQuoteControl
and its unit tests have been refactored. GitHub-29672
- Corrected the code style of the return type declaration in
app/code/Magento/Captcha/CustomerData/Captcha.php
. GitHub-29712
- Corrected the position of the button list on the New Attribute page.
- Added the correct block class for the frontend
viewModel
reference example for the\Magento\Framework\View\Element\Template
class. GitHub-30450
- A redundant fieldset in the Sale Rule form has been removed. GitHub-29599
- Unnecessary code has been removed from the
hierarchy/edit.phtml
template.
- Corrected PHPdoc comment in
app/code/Magento/CatalogImportExport/Model/Export/Product.php
. GitHub-30833
- The docblock annotation for the
PublisherInterface
message has been corrected. GitHub-30190
- Corrected arguments in the
getStatusByState
method. GitHub-30173
- Corrected method description in
app/code/Magento/Quote/Model/Cart/Totals/ItemConverter.php
. GitHub-30125
- Removed redundant variable assignments in the same line in multiple files. GitHub-30133
- Changed
@param string $attribute
to@param AbstractAttribute|string[]|string $attribute
inEntityAbstract.php
. GitHub-30191
- Invalid tags (for example,
@package
and@subpackage
) have been removed from docblocks throughout the code base. GitHub-30061
- Unused parameters in the construct of the
AdvancedPricing
class have been removed. GitHub-29531
Configurable products
- Filtering out-of-stock configurable products by price now displays results within the correct price range.
- A virtual product no longer changes type when its status is changed from enabled to disabled (or vice versa). Previously, the application changed a product’s type from virtual to simple when its status changed.
- The
getValue()
method no longer triggers a fatal error when updating carts.
- Configurable products that are available on multiple websites no longer show simple child products that are not assigned to the specific website. GitHub-28291
- Storefront product pages now display tier prices without taxes as expected. GitHub-12225
- MSRP prices for configurable products are now converted to the chosen currency correctly. Previously, the application displayed prices in the wrong currency and threw this error:
Call to a member function setAppliedTaxes() on null
. GitHub-26526, GitHub-29603
- Merchants can now save a store-specific text swatch attribute option label with a value of 0 (zero). Previously, a value of 0 was replaced with the Admin label option value. GitHub-30073
cron
- The System Message list now accurately reflects product updates after
cron
has run and the application has updated products as scheduled.
- An index based on
schedule_id
andstatus
has been added to thecron_schedule
table. GitHub-29601
Custom customer attributes
- The application now displays customer attributes of type
file
on the Account Information page after creation. Previously, when you tried to save a new attribute of this type, the application displayed these errors:The "newAttribute" attribute value is empty. Set the attribute and try again
andValidation is failed
.
- The application now correctly displays multi-line custom customer attribute values. Previously, not all data was displayed.
- The application now alerts shoppers when they enter an invalid birth date while creating an account. Previously, the validator disregarded locale settings, and shoppers were redirected to the Create New Customer Account Page with an invalid date error.
- Custom address attributes are now included as expected in the Payment step of the checkout workflow.
- Custom address multi-select attributes are now correctly displayed during guest checkout and on the Admin and My Account order details page.
- You can now delete a leading zero in a custom customer attribute when
Input Type
is set toText
andInput Validation
is set toNumeric Only
.
- The application now successfully exports customer data that includes a custom gender attribute value.
Customer
- The calendar widget for the storefront customer account page date of birth field now uses the designated store locale.
- The application no longer saves duplicate entries of a customer address during checkout of a re-order for an existing customer from the Admin.
- Deleting all addresses from multiple customers from the Admin now deletes all addresses from the customer address list and removes default billing and shipping addresses. Previously, the applicationdeleted the address from the customer address list but did not remove the default billing and shipping addresses.
- The Admin customer address tab now correctly displays address count after an administrator has performed a mass deletion of addresses. Previously, the application included deleted addresses in its count.
- The DateTime format for the Date of Birth field on the customer registration page has been corrected. Previously, the leading zero that preceded a single-digit day was missing.
- Date format validation for the Date of Birth field now works before the shopper clicks the Create an account button. Previously, a shopper could enter a value in an invalid format, and when they clicked the Create an account button, the shopper was redirected to the Create New Customer Account Page with an invalid date error.
- The application no longer throws a fatal error when an administrator tries to save a new customer account that contains invalid data for an attribute.
- The application no longer throws a 400 error when a customer tries to access their shopping cart in a deployment where Magento Shipping was previously installed and the default Luma theme is currently deployed. Previously, the application did not filter out section names that were created by previously installed/enabled modules that were not supported in the Admin before sending requests to the server, which generated errors.
- The application now displays a message as expected when a shopper creates a guest account when the Require Emails Confirmation setting is enabled and
Magento\Customer\Controller\Account\CreatePost
has been overridden. Previously, the application did not permit this type of customization of the user registration process, and under these conditions, a user’s email confirmation status was considered complete, the new user was automatically logged in, and no error message was shown.
- The application now assigns a shopper to the correct customer group when the shopper places an order with a non-default customer group in a store where Enable Automatic Assignment to Customer Group is enabled. GitHub-26976
- The Admin customers grid is now available as expected when the non-default website is deleted in a multi-site deployment when indexes are set to Update by Schedule. Previously, the application did not display the grid and threw this error:
[2020-12-09 11:31:54] report.CRITICAL: The website with id 2 that was requested wasn't found. Verify the website and try again. \{"exception":"[object] (Magento\\Framework\\Exception\\NoSuchEntityException(code: 0): The website with id 2 that was requested wasn't found. Verify the website and try again. at /var/www/html/magento24ee/vendor/magento/module-store/Model/WebsiteRepository.php:110)"}
dotdigital
-
Error handling has been improved when retrieving lists of programs from dotdigital Engagement Cloud.
-
The value that is synced in the store name column during guest sync is now the store view name as expected. Previously, the website name was included in this column.
-
Added an array check before looping over order status automations after an order is saved.
-
Resolved issues with Composer upgrades that were the result of the dotdigital module’s dependency on
magento/module-authorization
.
Downloadable
- The application no longer lists a downloadable product in My Download Products tab after the order that it belongs to has been partially refunded. GitHub-28388
EAV
- Custom attributes that use
\Magento\Eav\Model\Entity\Attribute\Backend\ArrayBackend
now use default values if no value is provided in the payload when a product is created by API call.
\Magento\Config\Model\Config\Source\Email\Template::toOptionArray
no longer throws an error whensetPath()
is not called beforetoOptionArray()
. GitHub-29315
- The application now correctly converts plain text to HTML when you click Return Html Version when loading an email template.
- Email sent to customers that contain partial invoices now includes accurate item subtotals. Previously, the subtotal in this email was the total of the ordered quantity, not the total amount of the invoiced quantity.
- The application now sends email reminders to all relevant customers with valid email addresses. Previously, the applicationstopped sending reminder emails to customers after encountering one invalid address.
- Sending sales email in asynchronous mode now works as expected after a product is removed from a catalog. Previously, asynchronous email sending was blocked, and the application displayed this error:
main.ERROR: Cron Job sales_send_order_invoice_emails has an error: Call to a member function getData() on null. Statistics: {"sum":0,"count":1,"realmem":0,"emalloc":0,"realmem_start":73400320,"emalloc_start":37177640} [] []main.CRITICAL: Error when running a cron job {"exception":"[object] (RuntimeException(code: 0): Error when running a cron job at /var/www/html/vendor/magento/module-cron/Observer/ProcessCronQueueObserver.php:327, Error(code: 0): Call to a member function getData() on null at /var/www/html/vendor/magento/module-catalog/Helper/Image.php:502)"} []
. GitHub-26878
- The application no longer copies a customer on order confirmation email when
sales_email/order_comment/enabled
is disabled andsales_email/order_comment/copy_method
is set tobcc
. GitHub-29915
Frameworks
- Customized filter groups are now applied correctly when searching on customers. Previously, the
afterSearch
function did not OR filters as expected. GitHub-24576
- Images on a store’s home page are now rendered successfully. Previously, the page source HTML was corrupted because the three consecutive slashes in the image’s base64 code was misinterpreted as a comment.
- DatePicker now works correctly when filtering orders on the Admin Orders list in stores using the Arabic locale (
ar_SA - Saudi Arabia
).
- DatePicker now displays the correct date after a merchant saves a cart price rule in a deployment. GitHub-30382
- The application now correctly represents Arabic thousands grouping and Arabic decimal separator symbols. Previously, Arabic symbols were trimmed. GitHub-26676
- The application now deletes expired database sessions from the database
session
table as expected.
General fixes
- You can now configure a native session handler that differs from the handler that is defined in
php.ini
. Previously,SessionManager
did not set the memcache assave_handler
, but instead used the file’ssession_handler
. the application threw this error:main.CRITICAL: Warning: SessionHandler::read(): open(127.0.0.1:11211/sess_0imeeaqmnvemdg4e3h57tat0ik, O_RDWR) failed: No such file or directory (2) in../vendor/magento/framework/Session/SaveHandler/Native.php on line 22 {"exception":"[object] (Exception(code: 0): Warning: SessionHandler::read(): open(127.0.0.1:11211/sess_0imeeaqmnvemdg4e3h57tat0ik, O_RDWR) failed: No such file or directory (2) in ../vendor/magento/framework/Session/SaveHandler/Native.php on line 22 at ../vendor/magento/framework/App/ErrorHandler.php:61)"}
. GitHub-24717
-
The following improvements have been made to the
LoginAsCustomer
modules:-
Replaced the
around
plug-in withafter
-
Removed redundant code
-
Replaced
(bool)->getValue()
withisSetFlag
. GitHub-29689
-
- Reloading all customer-data sections by wildcard (*) no longer causes requests to
customer/section/load
to throw a 400 error. GitHub-28154
- The application now passes exceptions that occur when a layout is rendered in production mode to
var/report
. GitHub-29606
- Merchants can now unassign products from categories as expected. Previously, the application threw an error similar to this error:
Could not save product "4" with position 0 to category 3
.
- The application now throws an exception when a customer who does not exist requests a password reset. GitHub-26288
- The application now displays an informative error message when an administrator tries to save a customer account that contains an invalid value for a customer attribute while uploading a file that this attribute value. Previously, the application threw a fatal error. GitHub-30295
- The application now applies the Logo for HTML Print View configuration setting to storefront invoice PDFs as expected. GitHub-24730
static::
has been replaced withself::
throughout the codebase for accessing private constants. GitHub-30781
- The application now opens the New Attribute page as expected when a merchant clicks the Create New Attribute button twice during product creation. Previously, the application displayed an empty page and threw an error. GitHub-30361
- The application no longer displays the
The coupon code has been accepted
message after a coupon has been removed. GitHub-30255
- Administrators can now assign widgets to specific categories. GitHub-30009
- Attribute selector
input[type=datetime]
has been replaced with a less specific input type selector. GitHub-30064
- The application now displays store-specific values that are associated with custom category attributes as expected. GitHub-13440
- The application now displays a prompt asking whether the customer group should be changed when you click the Validate VAT Number button on the order creation page when the store address and shipping destination belong to different EU countries. GitHub-29652
- The
\Magento\Catalog\Model\ImageUploader
class has been refactored to use the newmoveFileFromTmp
method. GitHub-29598
- The application now displays a more informative error message when a merchant tries to create a product attribute with
product_type
andtype_id
codes to be more descriptive. GitHub-28479
- Corrected validation logic for the Customer Token Lifetime (hours) and Admin Token Lifetime (hours) fields on the Admin Stores > Configurations > Services > OAuth page. GitHub-29502
- The application now correctly parses text that contains
}}
in the widget content field. GitHub-12087
- You can now remove a filter from the Product Categories page. Previously, when you tried to delete the filter, the application did not let you remove the filter and displayed this error:
Something went wrong
. GitHub-8538
Magento\Framework\MessageQueue\ConfigInterface
can now be instantiated when optional moduleMagento_MessageQueue
is disabled. Previously, the application threw this error:PHP Fatal error: Uncaught Error: Cannot instantiate interface Magento\Framework\MessageQueue\ConfigInterface in /var/www/magento2/magento2/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php:121
. GitHub-26080
- Logic that determines when the application can retrieve email value from persistent storage has been improved. Previously, the application displayed populated password fields on the checkout page when an unregistered user returned to the checkout page after first completing the email field. GitHub-26903
- A missing
aclResource
attribute has been added to the Admin headerAdminNotification
toolbar block. Previously, the Admin notification toolbar entry was visible even when the Admin user does not have role resource permissions to see it. GitHub-29067
- The
framework/database/select
where
functions now handletype
correctly. GitHub-29590
- Inefficient use of
array_merge
in loops has been improved throughout the codebase, which has improved performance in several places, including in the static content deployment process. GitHub-30183
- The default Admin session lifetime has been moved from the encryption module to the security module. GitHub-30859
- The application now checks for private constants in a class and displays a warning if there are any
static::
calls to them. Previously, the application threw this error:Undefined class constant
.
- Added support for symlinked
root
in errors pages and maintenance mode. Previously, if theroot
ormagento/pub
were symlinked into a different directory, the error processor (Magento\Framework\Error\Processor
) did not generate a correct view file URL. GitHub-30296
- Added missing
order_data
array toEmailSender
classes. This brings these classes into alignment with Magento’s recommendation to use scalar variables instead of objects within the email templates. GitHub-29604
GraphQL
- The GraphQL URL resolver now handles query parameters correctly. Previously, it returned NULL when handling SEO-friendly URLs with parameters.
- The GraphQL URL resolver now handles CMS page hierarchy correctly. Previously, it returned NULL. GitHub-30474
- Queries for a product’s
categories.breadcrumbs
data no longer return breadcrumb data for categories whose parent category is disabled. GitHub-30468
- The path to a category image is now returned correctly when URL rewrites are disabled.
- The application now returns a more informative message when an error occurs with during a GraphQL password reset operation. GitHub-30179
- Products positions are now updated as expected in GraphQL query results when the query results are cached.
- The
products
query now returns the expected results when thecategory_id
filter is specified with thein
keyword. GitHub-30349
- Added rules to
editorconfig
to support indenting JSON and YAML files two spaces. GitHub-30066, GitHub-30063
- The
FlushCacheByTags
class has been updated to use after-plug-ins instead of around plug-ins. GitHub-29558
- Code in the
checkout_index_index.xml
file has been enhanced by the removal ofsortOrder
frommessages
,authentication
,progressBar
,estimation
, andsidebar checkout
components. GitHub-30550
- Content in
calc
is now escaped, which results in correctcalc
values in the CSS output file. Previously, the application returned an incorrectcalc
value. GitHub-30542
- The URL rewrite generator now sets the category object
url_key
,url_path
, andstore_id
to default store values when saving category URL rewrites for the global scope. Previously, it savedurl_key
,url_path
, andstore_id
with the values of the last processed store ID. GitHub-29585### Grouped products
- The products query now returns all expected data for grouped products. Previously,
product_links
was an empty array.
- A grouped product is now listed as out-of-stock on the product edit page when all child simple products are out-of-stock.
- The status of a grouped product now updates correctly on the product edit page when the status of its child simple products changes to out-of-stock. Previously, the inventory stock item for the parent of the grouped product did not update after its children changed stock status.
\Magento\Widget\Controller\Adminhtml\Widget\Instance\Validate
now recognizes a phrase result value as an error message and outputs it to the user during widget validation. GitHub-27397
- The hard-coded list of category attributes in
Magento\Catalog\Model\Category\DataProvider::getFieldsMap()
has been replaced with a list of attributes that are generated from cache. GitHub-13440
- Redundant hashing of
req.http.host/client.ip
has been removed and hashing is handled by the Varnish built-in VCL. GitHub-29988
- Added a failure callback to the
Magento_Ui
file uploader. GitHub-29557
- An
acl.xml
inconsistency that occurred whenMagento_LoginAsCustomerAssistance
was enabled butMagento_LoginAsCustomerAdminUi
orMagento_LoginAsCustomerLog
were disabled has been corrected. Previously, when administrator with these credentials tried to log in to the Admin, the application displayed a blank page and threw this error when :Exception #0 (LogicException): Could not create an acl object: Invalid Document Element 'resource': The attribute 'title' is required but missing. Line: 13
. GitHub-30680
- The application no longer throws an
Undefined class constant
error when anInterceptor
is generated during plug-in creation. GitHub-28981, GitHub-29879
- The application now correctly handles messaging and logging for asynchronous bulk operations. Previously, although products were updated, the
magento_operation
andqueue_message_status
tables were not updated correctly, and system messages were incorrect. GitHub-29718
- A shopper is now redirected to the Set a New Password page as expected when they click Set a New Password in the Reset Password email when Require Emails Confirmation is enabled for the store. Previously, the shopper was redirected back to the Forgot Your Password button on the login page. GitHub-27954
- Corrected array to string conversion error when saving row system configuration with default values. GitHub-30314
- You can now set arguments for message queues. GitHub-30216
- The base file collector now respects
AppState->emulateAreaCode()
. GitHub-39656
- The new
BlockByIdentifier
class supports retrieving a layout block based on CMS block identifier. As a result, when a CMS block is removed from cache, the application also clears the layout block cache. GitHub-28309
- Corrected problems with numeric argument conversion in queues. Previously, when you declared a queue with numeric
type
arguments in thequeue_topology.xml
, the argument value was cast to string. GitHub-29615
GraphQL
- The
urlResolver
query now handles query parameters correctly.
- The
urlResolver
query no longer returns NULL when a custom CMS node and page are specified as input. GitHub-30474
- The
category
query no longer returns child categories of a parent category that has been disabled. GitHub-30468
- The
category
query now returns the correct path of a category image when URL rewrites are disabled.
- The
resetPassword
mutation now returns a more informative message when an error occurs. GitHub-30179
- Cached results of the
products
query are invalidated as expected when product positions change. GitHub-30467
- The
products
query now returns the expected results when thecategory_id
filter is specified with thein
keyword. GitHub-30349
- The
categories
andcategoryList
queries now consider category availability based on category permissions configuration and parent category ID. GitHub-29880, GitHub-30624
- The
updateProductsInWishList
mutation now properly validates wishlist items. GitHub-30467
-
Deprecated several attributes in the
ProductInterface
andCategoryInterface
to prevent their use on the storefront. GitHub-30625 -
Prices are now hidden from products query results when the category permissions are set to hide them. GitHub-29926
- You can now use the
addProductsToWishList
mutation to add a bundle product with a user-defined quantity to a wishlist.
- GraphQL response time for add to cart operations has improved.
- The
products
query now returns tier price values as expected. GitHub-29168
- Removed a redundant
getMappedNums
from a loop inlib/internal/Magento/Framework/GraphQl/Query/EnumLookup.php
. GitHub-30031
- The
products
query no longer returns an error when the queried product has a disabled related product. GitHub-28892
- The
cart
query now returns prices that have been converted into the correct currency (the default display currency). Previously, the query returned the item price value in base currency, and the currency code was returned as default display currency.
- GraphQL now honors catalog permissions. The application restricts which items are returned for a
products
query based on the shopper’s customer group.
- Added the
customizable_option
attribute to multiple data types that implement theCartItemInterface
.
- Added attributes for the
storeConfig
query to return store, store group, and website information.
- Reinstated the
SelectedCustomizableOption.type
attribute. In addition, thecustomizable_options
attribute within various implementations of theCartItemInterface
are now non-null.
- The search functionality of the
products
query no longer returns items in which category permissions have been enabled.
- The
products
query returns the correct currency for store views that have multiple currencies.
- Labels for
products
query filters now return translated values, when applicable for non default store views.
- Fixed store currency amounts on gift cards in the cart.
- Added the
ConfigurableProductOptionsSelection
data type, which contains metadata corresponding to the selectable configurable options for a product. Use this object in aproducts
query to minimize the number of media gallery items that are displayed as the shopper selects configurable product options.
Images
- Images on a store’s home page are now rendered successfully. Previously, the page source HTML was corrupted because the three consecutive slashes in the image’s base64 code were misinterpreted as a comment.
- The dependency on the
fileinfo
extension has been removed from the CMS module. Previously, the application threw an error when you tried to upload an image using the image uploader, which is launched when you click the Insert Image button when adding content. GitHub-24332, GitHub-16531, GitHub-29852
- Added support for reading
exif_image.png
orexif-image.jpeg
metadata. GitHub-1449
- CMYK images colors are now rendered correctly. When the Imagick adapter now detects that an opened image has a CMYK colorspace, the colorspace is converted to SRGB. Previously, these images were rendered with inverted colors. GitHub-22375
- Boolean values are no longer set for
image_with_border.phtml
. Redundantmax-width
andheight
settings have been removed from.product-image-photo
. (These values are already set globally on the image through the reset styles.) GitHub-30186
Import/export
- Customer address
region_id
is no longer assigned aNULL
value when you import customer addresses using a CSV file (entity type = "customer address"
andimport behavior = "add/update"
) from which certain field values have been deleted.
- You can now hide product images on the storefront during import.
- When an imported product has
qty
set to 0 butis_in_stock set
to 1 in the CSV file, the product is not listed on the category page, and the product details page identifies it as out-of-stock. Previously, products with these values were visible on the storefront after import.
- CSV import no longer ignores the
dropdown
andtextarea
values for additional attributes. Previously, these attribute values were not updated during import.
- The product export CSV file now appears in the Admin list of export CSV files as expected. Previously, the application threw an error when you ran this command:
bin/magento queue:consumers:start exportProcessor --single-thread --max-messages=10000
.
- The application no longer throws an error when importing CSV data that includes Bengali (Bangla) alphabet characters.
- The application now displays an informative error message when an administrator clicks Check Data during import of a file that has been changed since export when working in Chrome. Previously, the application displayed a console error but did not tell the user how to proceed.
- The application no longer duplicates product images when you import the same product CSV data more than once. GitHub-21885
- The limit of 90 characters for image file names in
vendor/magento/framework/File/Uploader.php
has been removed. Previously, directory and file name length could not exceed 255 characters. The application imported products with images whose file name exceeded this limit, but did not import the image file. GitHub-29377
- Coupon codes can now be successfully exported to CSV or XML. Previously, the application displayed a 404 error when you clicked Export CSV or Export XML when you tried to export coupons. GitHub-29277
- Duplicated product images are now removed after importing a CSV file that contains images. GitHub-14398, GitHub-21885
Index
- We have improved the performance of the partial indexer. The application now clears the cache IDs that were changed for each 1000-ID batch iteration. Cache context no longer accumulate IDs. Previously, cache context accumulated cache IDs for each 1000-ID batch iteration and cleared the same set of IDs on each iteration.
- Inconsistencies between the partial re-indexing system and the full re-indexing system have been corrected. Both indexing systems now use the same code, which works correctly. Previously, both indexing systems used different logic in regards to the shared indexers, which potentially caused indexers to be invalidated after every run of the partial re-indexing system. GitHub-29478, GitHub-29297
-
We have resolved issues with the manual indexer that had resulted in either empty category pages or reduced product count on category pages. Issues with incomplete category pages or product count occurred when:
-
the
catalogsearch_fulltext
andcatalog_product_price
partial indexers were executed on a large catalog until these indexers completed execution. -
the partial indexer was executed on either
catalog_category_product
orcatalog_product_category
indices, and at the same time a full re-index was executed on one of those indices. These two indexing processes could conflict, which resulted in products missing from category pages. -
bin/magento indexer:reindex inventory
was executed on a large catalog. Products were missing from category pages until thecatalogsearch_fulltext
partial indexer completed execution.
-
- An indexer has been added to the
Magento_Bulk
MySQL table, which has improved the performance of bulk operations.
- Comments in database tables now accurately reflect table status after re-indexing (
bin/magento indexer:reindex
). Previously, table comments after re-indexing contained the same values that comments contained after a fresh installation.
- The
SELECT entity_id IN
statement has been improved in deployments implementing MariaDB v.10.3.18, which has improved the performance of catalog category indexing. GitHub-25199
- Magento Open Source has improved cache performance by eliminating the flushing of tags multiple times per indexer instance. GitHub-29890