Magento Commerce 2.2.4 Release Notes

Patch code and release notes published on May 2, 2018.Release notes revised on July 1, 2018.

We are pleased to present Magento Commerce 2.2.4. This release includes new tools and numerous functional fixes and enhancements, plus a substantial number of contributions from the wider Magento community.

Highlights

Look for the following highlights in this release:

Significant new bundled extensions that add instant and accurate tax and shipping calculations right from the cart:

Amazon Pay provides a trusted, familiar way for customers to check in and check out. See Amazon pay for a full description of the advantages this solution offers merchants and their customers.

Vertex simplifies and automates the complexity of calculating sales tax. For more information on Vertex products, see Vertex Release Notes. Check out the Magento User Guide discussion of Vertex, too.

Klarna Payments is a new payment method. With Klarna Payments, merchants can provide customers with the option to pay now, pay later, or pay by installment for their purchases. See Magento User Guide for information on using Klarna with Magento. For more information on Klarna products, see Klarna Payments.

Numerous fixes and enhancements to the Magento Shipping and dotmailer bundled extensions. Merchants can now use dotmailer to create their own transactional email templates. Magento Shipping capabilities have been expanded, too.

Fixes and enhancements to core features, including performance improvements that enable faster shopping with image loading and search performance enhancements.

Almost 200 community contributions. These community contributions include performance-tuning enhancements plus at least 80 engineering fixes.

Enhancements

This section describes changes in this release that are not full-fledged features or bug fixes, but that add noticeable improvements to product performance or ease-of-use.

The admin global search is now translatable, extensible, and takes into account the ACL settings for the current user. See Using global search for more information. Fix submitted by Roman K. in pull request 1167. GitHub-7698

The multishipping checkout flow now supports the CyberSource payment method. This payment method is supported on Magento Commerce only. As part of the process of adding CyberSource support, we’ve made improvements to the Multishipping module to simplify integration process for other payment methods.

Magento has an automated checker to enforce the short array syntax convention that we are now enforcing in new code. This standard complies with all requirements of PSR-2. Fix submitted by Nickolas Malyovanets in pull request 12499.

The Emogrifier dependency has been upgraded to 2.0.0 or later. Fix submitted by Oliver Klee in pull request 13132.

We’ve replaced is_null with strict comparison only for models and block in the following modules: Catalog, Tax, Sales, and EAV. Fixes submitted by Alexander Shkurko in pull requests 13171, 13170, 1163.

dotmailer enhancements

The dotmailer bundled extension features the following enhancements for this release:

The new Abandoned Cart report table

The ability for merchants to design their own transactional email template

Enhancement of syncs of subscriber’s sales data. Sales data is now synced only if the sales data option is enabled in config.

The ability to set transactional email at the Store level

Enhanced validation for deletion of cron job CSV files

Known issue

Note: The following known issue has been resolved in Magento Commerce and Open Source 2.2.5. We recommend that all users of 2.2.4 upgrade to 2.2.5 at their earliest convenience. If you are unable to upgrade to 2.2.5, Patch MAGETWO-92926 provides a fix for this issue.

Customers have reported the following behavior after upgrading to Magento 2.2.4 in deployments that span multiple websites:

Magento multi-store installations do not use the store view-specific values from the store configuration settings if these settings have different values than the global default configuration settings. Instead, Magento uses the default configuration for all store views. GitHub-15205, GitHub-15245

We do not recommend upgrading to Magento 2.2.4 if you deploy across multiple websites. Note that this problem is not triggered if you have only a single website with multiple stores or store views.

You can now set API access to integrations for Admin roles, which gives privileged users the ability to grant limited access to users such as third-party integrators. GitHub-9684

You can now enable or disable the Magento Profiler from the command line. GitHub-9277

The icons for Extension Manager and Module Manager are now consistent with the main content area and left-hand menu of the Web Setup Wizard. Fix submitted by Danny Verkade in pull request 11388. GitHub-11236

Magento now continues operating in maintenance mode if it was previously enabled. Previously, Magento disabled maintenance mode when you used one of these commands:

You can specify a custom version for static files being deployed, and now nginx sample config files can match these custom versions, too. Fix submitted by Scott Buchanan in pull request 12521.

The CrontabManager.php file has been updated as follows: If crontab has already been populated, the bin/magento cron:install command adds #~ MAGENTO START and the rest of code directly to the last row of crontab without any spaces. Fix submitted by Michele Fantetti in pull request.

The ext-bcmath PHP extension is now required in Open Source. Previously, it was required for Commerce only. Fix submitted by Mobecls in pull request 12768.

The cache_lifetime default setting for the Magento\Theme\Block\Html\Footer block is no longer set to false, and the new default setting is 3600. Fix submitted by zolat in pull request 13762.

The bin/magento maintenance:allow-ips command now has the --add flag, which appends a new IP address to the list of allowed IP addresses. Previously, when you added a new IP address, you had to copy the existing addresses. Fix submitted by Barry vd. Heuvel in pull request 13586.

The config:set command now has a lock-config option, and configuration values are always stored in app/etc/config.php instead of app/etc/env.php. Fix submitted by Andreas von Studnitz in pull request 13280.

In the Backend/etc/adminhtml/system.xml file, the url group and redirect_to_base field are now configured so that the showInWebsite and showInStore attributes are set to 1. Fix submitted by Jeroen in pull request 13614.

You can now deploy static content on demand while in production mode.

The output of the magento maintenance:status command no longer inserts a comma in between IP addresses, making it easier to copy and paste the values. Fix submitted by Barry vd. Heuvel in pull request 13587.

Bundle products

You can now duplicate a bundle product without stripping the original bundle product of its options. Fix submitted by MattUnity in pull request 1217.

Catalog

Magento now successfully updates a product’s stock_itemextension_attribute parameter for a product previously created using REST. Fix submitted by nuzil in pull request 13494.

When two customers check out concurrently for the same product, one of the checkouts now succeeds. Previously, when two customers checked out concurrently for the same product, and the total quantity being ordered is greater than the quantity available, the stock could become negative. Fix submitted by Myroslav Dobra in pull request 2133.

When sorting by price, Magento now displays the same number of products no matter how it sorts products in the Catalog Product list. Previously, Magento reduced the product count by the number of disabled products when sorting by price.

The category filter used for layered navigation for configurable products with no available options now counts products accurately.

When you set the category_ids attribute to be visible in the storefront catalog, Magento now displays catalog listings as expected. Previously, Magento threw an exception. Fix submitted by Manu Gonzalez Rodriguez in pull request 11389. GitHub-11341

Product display issues within categories that have been filtered by price have been resolved: Products are no longer repeated within a category, and random products are no longer included. Fix submitted by Mayank Zalavadia in pull request 11429. GitHub-11139

Updating a product with the REST API (PUT /rest/all/V1/products/example_sku) no longer assigns the product to all websites automatically. (Automatic assignment to all websites now occurs only when you create the product in All Store Views scope.) Fix submitted by adrian-martinez-interactiv4 in pull request 11444. GitHub-11324

Magento no longer throws an error when you re-save a product attribute with a new name. Fix submitted by Raul Mateos in pull request 11617. GitHub-6770

You can now successfully remove a toolbar from a product listing page. Previously, you could explicitly remove the toolbar from layout configuration, but Magento would return product_list_toolbar to the layout. Fix submitted by Marius in pull request 11473. GitHub-9413

The getAttributeText($attributeCode) method now returns string values as expected. Previously, this method returned an array of attribute values. Fix submitted by p-bystritsky in pull request 12003.

You can now add customizable options to a product. Previously, when you tried to add a custom option to product, Magento threw this error: A 'Uncaught TypeError: Cannot read property 'apply' of undefined' error. Fix submitted by Roman K. in pull request 11965. GitHub-11792

You can now save emojis in custom product options. Fix submitted by Carlos Lizaga in pull request 12253.

The delay parameter now works as expected, which permits you to set the delay on the JQuery widget opening or closing. Previously, this parameter was documented, but did not work as expected. Fix submitted by Sam Carr in pull request 12161.

You can now delete rows in the dynamicRows component. Fix submitted by Roman K. in pull request 921. GitHub-8830

You can now add a new product with custom attributes that has the same name and attributes as a previously deleted product. Previously, Magento did not let you add this new product because a request_path with the same value already existed in table url_rewrite from the previous product. Fix submitted by Nickolas Malyovanets in pull request 12167. GitHub-12110

cURL requests to delete a product’s tier pricing when used on store code all now works as expected. Previously, this cURL request deleted the tier pricing but also all the image selections for the product. Fix submitted by Nickolas Malyovanets in pull request 977. GitHub-10797

Sort by Price now works as expected on the catalog search page. Fix submitted by Roman K. in pull request 929. GitHub-12468

If an error occurs when you run catalog:images:resize, Magento now includes an entry into the log file. Previously, Magento displayed an error message, but did not add an entry into any log files. Fix submitted by Roman K. in pull request 1000. GitHub-8204

You can now duplicate and save a product successfully. Previously, you could not successfully duplicate a product, and Magento displayed this message: Notice: Undefined offset: 0 in /home/software/public_html/vendor/magento/module-catalog/Model/Category/Link/SaveHandler.php on line 124. Fix submitted by p-bystritsky in pull request 983. GitHub-12259

The REST API now saves all product properties as expected. Previously, Magento did not save the price and weight, and these attributes were not returned in the result of the POST request. Fix submitted by Nickolas Malyovanets in pull request 1018. GitHub-6486

The hasDataChanges attribute for loaded EAV collection items now returns true or false as expected. Previously, this attribute always returned true. Fix submitted by virtual97 in pull request 12736. GitHub-12374

ajax:addToCart now contains the eventData parameter, with variables for SKU and quantity. Fix submitted by Renon Stewart in pull request 12875.

You can now successfully save a new option for a product custom attribute when the value of Admin scope is empty. Previously, Magento threw an exception. Fix submitted by virtual97 in pull request 12755.

You can now save a product with customizable options. Previously, if you were trying to add a customizable option (for example, a customer group) to a product, Magento did not let you save the product, the form did not close, and a validation issue was triggered. Fix submitted by LuisMi in pull request 12048. GitHub-11528

Visual Merchandiser now includes website scope when displaying the correct prices and availability of configurable products.

The catalog product list widget now works with multiple SKUs. Previously, Magento displayed this error, We're sorry, an error has occurred while generating this email. Fix submitted by Nickolas Malyovanets in pull request 1050.
GitHub-11897

Magento now loads type-dependent layout handles before more specific ID/SKU layout handles. Previously, when Magento updated a product page layout for a specific ID with catalog_product_view_id_<product_ID>.xml, some changes were overwritten by a less specific catalog_product_view_type_<product_type>.xml. Fix submitted by Andreas Schrammel in pull request 12807.

Language switching nows works as expected on the Catalog and Product pages. Previously, language switching did not work on these pages in production mode. Fix submitted by p-bystritsky in pull request 1143. GitHub-11963

The subcategory URL path is now updated for a store view according to the URL path of its parent category.

In cases where imagebuilder makes multiple calls, it no longer re-uses attributes from the first call if attributes from a second call are empty. Previously, imagebuilder re-used the attributes from the first call, which lead to unexpected results in storefront image display. Fix submitted by Ihor Sviziev in pull request 13438.

An unused constructor dependency has been removed from the Product Link Save handler. Fix submitted by Ihor Sviziev in pull request 13436.

A database backup created by setup:backup --db and restored with setup:rollback -d now includes triggers as expected. Previously, the restored database did not include triggers, which meant that indexes could not work correctly. Fix submitted by Denis Ristic in pull request 11369. GitHub-9036

The Low Stock report now accurately lists all out-of-stock products. Previously, this report was not accurate when the All Websites view was selected. Fix submitted by gwharton in pull request 13682. GitHub-10595

We’ve improved the visibility of products when displayed by category, and you can now filter by status. Fix submitted by Peter Jaap Blaakmeer in pull request 12564.

Magento now correctly sets a product_links position attribute even when the attribute value is not set in a GET request. Previously, only the first two of each link type were shown in the backend or in a GET request response, even though Magento correctly added the product links to the database. Fix submitted by Mohammad Haj-Salem in pull request 12650.

We’re resolved issues with product creation that occurred on installations of Magento Commerce with B2B installed and Update by Schedule indexer mode set.

Cart and checkout

Magento no longer adds addresses with saveInAddressBook set to 0 to the address book for new customers. Previously, if you placed an order as a guest and set the save_in_address_book setting for an address to 0, Magento still copied that address to the customer address book when registering as a new customer on the checkout success page. GitHub-7691

You can now successfully change currency for an order before you complete the order. Previously, if you changed currency, when you proceeded with checkout by choosing a Bank Transfer Payment as Payment Method, Magento displayed, Your credit card will be charged for. Fix submitted by Roman K. in pull request 993. GitHub-12526

Magento no longer throws a JavaScript error on the cart from postcode validation when United States is deselected in the Allowed Countries Admin option (Admin > Stores > Configuration > General > Default Country). Fix submitted by codekipple in pull request 13051.

Magento now displays text on the New Cart Rules page correctly. Previously, labels listed in the Store View Specific Labels section of this page were sometimes truncated or duplicated. Fix submitted by Serhii in pull request 1146. GitHub-12231

When you check out as guest and click Create an account on the success page, you can now click on the customer name to jump to the customer record. Fix submitted by Renon Stewart in pull request 12998.

The XML_PATH_CUSTOMER_MUST_BE_LOGGED constant has been deprecated. Fix submitted by Roman K. in pull request 1148. GitHub-7848

dropdownDialog is now required when the minicart is available. Fix submitted by Alexander Menk in pull request 13830.

The Check Out with Multiple Addresses page now displays an empty state field as expected when a customer changes from one address to another. Fix submitted by enriquei4 in pull request 13364. GitHub-8621

Configurable products

You can now use custom price symbols when assigning prices to configurable prices. Previously, Magento did not properly display prices for configurable products when you used a custom price symbol when assigning prices. Fix submitted by pradeep-wagento in pull request 13025. GitHub-12430

If you enter an invalid value for an SKU during the creation of the configurable product, Magento now displays a warning and does not let you save the product. Previously, you were not warned about invalid SKU values, and when you clicked Save, all the product information you entered was lost. Fix submitted by Zamaroka in pull request 12737. GitHub-11953

Magento now displays the ID and Visibility parameter of child products when you use the LinkManagementInterface service contract to retrieve the ID and visibility of these products. Previously, Magento displayed NULL. Fix submitted by Nickolas Malyovanets in pull request 986.

Product records inside the catalog_product_super_link table are no longer updated needlessly when you save a configurable product. Previously, saving configurable product erased and then reinserted records in the catalog_product_super_link table even when child products were not changed. This practice quickly resulted in an unnecessarily large catalog_product_super_link table, especially in multi-website installations.

Customer accounts

Magento now trims trailing and leading spaces when saving the name of a new contact. Fix submitted by wardcapp in pull request 12964. GitHub-10415

We fixed the invalid parameter configuration that was provided for the $block argument of Magento\\Ui\\Component\\HtmlContent. Fix submitted by Tomasz Gregorczyk in pull request 12964.

Magento now successfully sends email (with content) even when you make a mistake in the email template file name. Previously, when the template name was incorrect, Magento sent the email with no content. Fix submitted by Roman K. in pull request 970. GitHub-8437

You can now import customer addresses from websites with country restrictions.

Magento no longer displays the Too many password reset requests error when the max wait time between password resets setting has been disabled. Previously, when you attempted to reset a customer’s password through the Admin, Magento threw an error even when you disabled the max wait time between password resets setting in the store configuration settings. Fix submitted by Cole Hafner in pull request. GitHub-11409

Magento no longer throws an exception when you try to open your account address book immediately after creating a customer. Fix submitted by Chris Pook in pull request 12220. GitHub-12180

The isConfirmationRequired method in the AccountManagement class is now public, which makes it available for plugins. (For example, you can now develop custom business logic to decide if confirmation is required (yes/no) for certain customers.) Fix submitted by Derrick Heesbeen in pull request 11878.

When configuring a customer account, you can now leave the prefix or suffix fields as optional. Previously, if you did not select an option for these fields, Magento defaulted to selecting the first option in the list. Fix submitted by Andreas von Studnitz in pull request 11462. GitHub-7241

The storefront Back to Sign in button now works as expected. Previously, when you clicked that button, Magento simply reloaded the current page. Fix submitted by StasKozar in pull request 12759. GitHub-12715

The window.checkout.customerLoginUrl now contains a URL that includes the referer in base64 encoding (for example, https://myShop.com/customer/account/login/referer/aHR0cHM6Ly9teXNob3AuY29tL2NoZWNrb3V0). Previously, the login URL did not include a referer (for example, https://myShop.com/customer/account/login). Fix submitted by Tommy Quissens in pull request 12630. GitHub-12627

When you are on the cart page and click a product’s Edit link, the product page now correctly displays the product quantity currently in the cart. Fix submitted by Arnoud Beekman in pull request 13310.

You can now create a custom attribute of type file for Customer objects as expected. Previously, you could create the custom attribute, but the file would not upload. Fix submitted by Mkennethsmith in pull request 13563. GitHub-11252

The event customer_address_after_save_viv_observer is now spelled correctly in the Customer events.xml file. Fix submitted by Renon Stewart in pull request 13661.

The is_subscribed extended parameter is now returned when a web API is used to modify or return information about a customer.

Dashboard

The top destinations configuration field is now configurable on a store level. Previously, it was configurable on the global level only. Fix submitted by Andreas von Studnitz in pull request 13052.

The scroll bar on the Admin store switcher is now scrollable on machines running OSX. Fix submitted by Juan Alonso in pull request 12931.

Directory

The \Magento\Directory\Model\PriceCurrency::format() method no longer fails if you do not configure a conversion rate from the base to the specified currency. Previously, if you did not specify this conversion rate, Magento rendered the price (amount) in the base currency, not the specified currency. Fix submitted by Nickolas Malyovanets in pull request 1022. GitHub-6965

Magento now requires that customers select State/Province when shipping orders to India, and the checkout page now provides a drop-down field with appropriate values. Fix submitted by p-bystritsky in pull request. GitHub-12378

EAV attributes

Creating new configuration attributes no longer causes naming collisions in the JavaScript UI registry. Previously, when you created a new default attribute and then subsequently created a new product, JavaScript errors occurred. Fix submitted by Volodymyr Zaets in pull request 12945. GitHub-12555

You can now use a single query to retrieve attribute groups from multiple attribute sets. Fix submitted by Marius Strajeru in pull request 12105. GitHub-11936

Magento now saves multiselect attributes for a product that has a related product using another attribute set. Previously, multiselect attribute values were not saved for a product in the Admin panel when it had a related product that used another attribute set. Fix submitted by awarche in pull request 12767.

The product attribute repository save method no longer resets the source model to null when you create a new product attribute through code. Fix submitted by Nickolas Malyovanets in pull request 1012. GitHub-10814

When a validation message is returned, Magento no longer displays the attribute code ($attrCode), but instead returns the label ($label). This change makes it easier to translate messages. Fix submitted by Hewerson Freitas in pull request 12120.

You can now perform a mass update on products that have more than 60 attributes.

Magento\Eav\Model\Config::getAttribute now stops the Profiler before it returns Profiler run time. Previously, Magento\Eav\Model\Config::getAttribute did not stop the Profiler from returning early, and consequently reported incorrect run time. Fix submitted by Nick Anstee in pull request 12810.

The beforeSave method encodes an attribute value only when it has not yet been encoded. Previously, the JSON-encoded attribute value was loaded correctly, but when you saved a product multiple times, the attribute value was also encoded multiple times. Consequently, Magento did save the product, and displayed this error, Unable to unserialize value. Fix submitted by Tibor Kotosz in pull request 13551.

The deprecated each() function has been removed from the code. Fix submitted by Ihor Sviziev in pull request.

Email

Order confirmation emails from the Admin in multistore environments no longer default to the primary store, but instead are sent from the store that the customer used. Fix submitted by Roman K. in pull request. GitHub-11740

Magento no longer sends misleading feedback when sending tracking information email. Previously, instead of sending a notice that a shipment was underway, this response was sent, You sent the shipment. Fix submitted by Nickolas Malyovanets in pull request 1245. GitHub-5697

Frameworks

You can now switch to default mode from production mode. Previously, if you tried to switch back to default mode, Magento displayed this error, Cannot switch into given mode 'default'. Fix submitted by Etty in pull request 12752. GitHub-4292

The filePutContents('file.txt') now contains content as expected. Previously, Magento threw this error, The specified "file.text" file could not be written*. Fix submitted by Nickolas Malyovanets in pull request 962. GitHub-7467

You can now subscribe to events that contain a number in their name. Fix submitted by Mobecls in pull request 12758. GitHub-5035

PhpDoc now shows correct parameter types. Previously, PhpDoc showed only a type of string, although array was also a valid parameter type. Fix submitted by Freek Vandeursen in pull request 12826.

Content no longer jumps when pages are reloaded on the Admin because notices-wrapper now has a min-height setting. Fix submitted by Anna Völkl in pull request 12985.

We’ve corrected a typo in the Magento\Ui\Controller\Adminhtml\Index\Render action. Fix submitted by Nick in pull request 12951.

X-Magento-Vary and PHPSESSID now have the same expiration time. Previously, the X-Magento-Vary cookie had an expiration of session, which meant it was not considered expired until the browser was closed. In contrast, the PHPSESSID cookie had a finite expiration time (not session). At times, this resulted in Magento caching the wrong page for the logged-in user.

Creating an observer that uses ObserverInterface no longer triggers a patch-level dependency on magento/framework. Fix submitted by Kristof in pull request 13759.

RewriteBase directive has been added to the .htaccess file in pub/static to support the potential installation of Magento code under a directory inside the web root. Fix submitted by Cristiano Casciotti in pull request 13678.

The doc block of the walk method in a collection now correctly describes that the method accepts a string or array. Fix submitted by ByteCreation in pull request 13373.

App framework

The customer grid indexer now works as expected. Previously, this indexer did not work when reindexing using the command-line interface during upgrade. Fix submitted by Leonid Poluyanov in pull request 10838. GitHub-10838

Customers with an empty Date of Birth field can now be saved even when the field is not marked (or checked on the JavaScript side) as mandatory. Fix submitted by Vova Yatsyuk in pull request 12302. GitHub-12146

You can now alter the transport variable in the email_invoice_set_template_vars_before event. Fix submitted by Roman K. in pull request 12132. GitHub-10210

Configuration framework

JavaScript framework

The depends field now works for fields of type radio in system.xml. Fix submitted by Javier Villanueva in pull request 11539.

Magento now sorts fields and amounts as expected when you extend a dynamic-row element in a ui_component and add a sort order attribute with an amount that falls between the other elements’ amount. Fix submitted by Harald Deiser in pull request 11846.

Session framework

The Setup Wizard page now loads successfully when the session storage method is memcache. Previously, Magento returned an HTTP 500 error when you navigated to System > Tools > Web Setup Wizard Setup Wizard in installations where you’ve configured the session storage method to memcache in env.php. Fix submitted by Marty S in pull request 11608. GitHub-9633

When you add a product to your wish list after logging out, Magento now redirects you to your account Wish list page and adds the product. Previously, you were redirected to your wish list page, but Magento did not add the product. Fix submitted by Oscar Recio in pull request 12038. GitHub-11825

Web API framework

A user who has been denied permissions for negotiable quote editing can now create customer addresses.

Swagger now works as expected on instances of Magento that are running on non-standard ports. Fix submitted by Jeroen in pull request 12541.

You can now set attribute values to empty strings using REST. Previously, Magento would not let you use REST to pass the following attributes with empty values: special_from_date, special_to_date, and special_price. Fix submitted by Roman K. in pull request 916. GitHub-8862

We’ve updated the webapi module to improve the order of how arguments are merged in multiple di.xml files. Fix submitted by Serhii in pull request 995. GitHub-8647

SearchCriteriaBuilder now has a check to determine if sort order should be applied. Previously, SearchCriteriaBuilder built wrong criteria (ORDER BY part). Fix submitted by Nickolas Malyovanets in pull request 1003. GitHub-5738

General

A customer can now successfully log out of a session and then immediately log back in. Previously, if a customer logged out and then attempted to log in without the logout success page first completing its timeout, Magento displayed the logout page. Fix submitted by Vinay Shah in pull request 13040.

Magento now displays notification messages for only the expected duration. Previously, Magento displayed these messages indefinitely within a session. Fix submitted by p-bystritsky in pull request 1111. GitHub-11527

Sorting by product name now works as expected when filters are applied. Fix submitted by p-bystritsky in pull request 1192. GitHub-12860

The <![CDATA[]]> statement in the system.xml file now works as expected. Previously, when you entered an XML layout update with CDATA for the first time, it worked as expected. After you saved the file, however, the CDATA tag disappeared. Fix submitted by Serhii in pull request 1163. GitHub-12322

Magento now strips out unnecessary whitespace in the attribute value IDs used on the review form. Previously, rating titles with whitespace resulted in broken ID attributes. Fix submitted by Nickolas Malyovanets in pull request 1119. GitHub-5451

The header label Price in the invoice PDF is now correctly aligned with the invoice item’s price. Fix submitted by Serhii in pull request 1216. GitHub-8453

The copyright year has been updated to 2018. Fix submitted by Bhargav Mehta in pull request 13027.

Magento now displays the Contact Us page in the menu as expected. Previously, Magento displayed unnecessary space between the category page and the main footer. Fix submitted by Sanjay Patel in pull request 13026. GitHub-12601

The Learn More Link widget option in the Recently Viewed Products widget now respects its setting. Fix submitted by Jeroen in pull request 12946.

An unused if statement in the order invoice Save.php has been removed. Fix submitted by Jeroen in pull request 12887.

The sid variable no longer appears in the storefront URL even if it has been disabled in the Admin. Previously, even when the Magento setting General > Web > Session Validation Settings > Use SID on Storefront was set to No, the sid variable no longer appears in the URL. Fix submitted by Roman Strelenko in pull request 12743. GitHub-9453

The menu item handling has been refactored to read item data from two different sources:

from original XML definition if the cache is empty

from transformed item data when available in the cache. Fix submitted by Pavel in pull request 12747. GitHub-9720

A typo in the SINGLE_PRODUCT_LAYOUT_HANLDE constant has been fixed. Fix submitted by Andreas Schrammel in pull request 12786.

The tracking link no longer returns a 404 error in the Admin. Fix submitted by Ihor Sviziev in pull request. GitHub-12206

White space that is prepended to a coupon code no longer causes an error. Previously, Magento did not apply the coupon and displayed this message: Coupon code is not valid. Fix submitted by Roman K. in pull request 1021. GitHub-12656

The modified date field on editing pages is now updated as expected. Fix submitted by Oscar Recio in pull request. GitHub-12625

Links to Magento Connect on the Partners and Extensions page have been removed and replaced with links to Magento Marketplace. Fix submitted by Miguel Balparda in pull request 12633. GitHub-12632

HTML tags have been removed from the display of attribute names in the dropdown menu of the Catalog Product list. Fix submitted by Nickolas Malyovanets in pull request 968. GitHub-8011

Magento now displays the orders that are associated with customer accounts on the Orders page. Previously, in the Admin display of customer accounts that have orders associated with them, Magento did not display orders on the Orders tab but instead displayed a blank page.

Magento now displays information messages about both successful and failed actions when a company administrator adds or deletes entries in the Company Users section. Previously, Magento displayed this error message, Something went wrong in the response body, and did not display a message.

The credit card form is now available when you create an order from the Admin, even when only one payment method is enabled. Previously, when only one payment method was enabled, the Admin did not render this form.

Full Page Cache is no longer invalidated after you save a predictor category. Previously, all product-related cache data was invalidated, when only a narrow subset of cache tags associated with the product_id should have been.

Magento now displays a more meaningful error message when a module name is misspelled in a unit test. Fix submitted by Nickolas Malyovanets in pull request 13740.

Magento now displays a more meaningful error message when a module name is misspelled in registration.php. Fix submitted by Jānis Elmeris in pull request 12843.

In the line Perform login specific action in StorageInterface.php, login has been replaced with logout. Fix submitted by David Angel in pull request 13679.

The incorrect field value in the joined variable_value table has been replaced with two values: plain_value and html_value. Fix submitted by Maksymilian Szydło in pull request 13596.

Magento/Rma/Block/Adminhtml/Rma/Edit/Item/Form/Element/Boolean is a new block element that allows rendering ability for the Boolean RMA attributes on the Admin.

Duplicate array keys in app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Attributes/Extend.php and app/code/Magento/Downloadable/Helper/File.php have been removed. Fix submitted by Leandro F. L. in pull request 12513.

The typo in the getDispretionPath function name has been corrected to getDispersionPath. Fix submitted by PascalBrouwers in pull request 12507. GitHub-12506

Magento now saves new orders created by guest accounts to the Order display as expected. Previously, Magento did not display the order with the customer information assigned to it, and although Magento sent email containing the order ID, the email did not contain information about the ordered items. Fix submitted by Roman K. in pull request 12241. GitHub-10128

CAPTCHA labels now reflect both the symbols and letters associated with the CAPTCHA image. Previously, the text labels referred to the CAPTCHA image referred to letters only, despite there being numbers in the CAPTCHA images, too. This ambiguity had the potential to mislead users about which text to enter. Fix submitted by RhodriOwainDavies in pull request 12387.

Customers can now successfully use RSS to share their wish lists. Previously, when a logged-in user added products to the wish list and then tried to share them using RSS, Magento threw this exception: report.INFO: Broken reference: the 'wishlist.email.rss' element cannot be added as child to 'root', because the latter doesn't existFix submitted by MediaCT in pull request.

When you select a new main menu option, the previously selected menu item now loses the ui-state-active class as expected. Fix submitted by Arnoud Beekman in pull request 13341. GitHub-13327

Issues with displaying full-screen images and video on the configurable product page have been resolved. Previously, Magento displayed video associated with product options on this page as images, rather than video, and full-screen mode for images ignored the configurations settings in view.xml. Fix submitted by Ievgen Shakhsuvarov in pull request 991. GitHub-12268

We’ve fixed issues with the “report module enable/disable changes as deployment markers” functionality in the Magento_NewRelicReporting module. Previously, if New Relic’s cron was enabled, Magento sent a New Relic deployment marker for every enabled module once per cron period. This resulted in an excessive number of events. Fix submitted by Kristof in pull request 12477.

The New Product Configuration process now works as expected from the Admin. Previously, on the last step of this process, Magento displayed the the element.disabled is not a function message, and did not create the product variations as expected. GitHub-12555

Gift card

Magento now includes a gift card recipient’s email address in the gift card account history. Previously, Magento did not include the gift card recipient’s name and email address in the gift card account history, even though Magento successfully sent the email.

Import/export

You can now successfully import product images and image labels from CSV files. Previously after import, the alt text field on the Admin was empty, even though the label was imported and was visible on the product list page as alt attribute, and the Product Detail page missed the alt attribute on image fields. Fix submitted by Ben Robie in pull request 11323. GitHub-9931

The CSV file created by using System > Export now incorporates the value of hide_for_product_page.
Fix submitted by Nickolas Malyovanets in pull request 11926.

You can now import a value of zero (0) into a custom attribute when using the Admin product import feature. Fix submitted by p-bystritsky in pull request 12283. GitHub-12083

You can now import or export a specific store view that includes custom options and bundle product options. Previously, the import/export feature did not include store view-level edits for custom options.

When you import information about existing customers, Magento now changes only the specific rows for this customer. If rows for other customer attributes (for example, group_id, store_id, created_at) are absent in the import file, these values are included unchanged.

Magento now provides a test for adding values in the system variable collection unit test. Fix submitted by Nickolas Malyovanets in pull request 13742.

You can now successfully import configurable products with specified configurable links when the store_view_code setting isn’t set. Previously, you could successfully import a configurable product with both configurable and additional attributes, but when you viewed the category to which the product belonged, the product was not displayed. GitHub-5876

You can now use the layout update XML field to include custom CSS in CMS pages. GitHub-4454

We’ve added an @api annotation to the block argument marker interface. This identifies this interface as requiring only a minor version dependency. See Dependencies for more information. Fix submitted by Vinai Kopp in pull request 13816.

Indexing

The URL that points to Magento crontab documentation has been updated to reflect current cron documentation in app/code/Magento/Indexer/Model/Message/Invalid.php. Fix submitted by Robbie Thompson in pull request 13050.

You can now view the state of the mview queue in real time, which can be useful when debugging indexing issues. Specifically, you can now view how many items are in the queue pending processing, as well as view information from the mview_state table. Fix submitted by Luke Rodgers in pull request 12122.

Infrastructure

Zoom now works as expected when using dropdown menus. Previously, zoom worked fine, but when you hovered over the category dropdown menu to the overlap area of product image and dropdown menu, the zoom was abnormally active, even though the mouse was still on the dropdown menu. Fix submitted by Mayank Zalavadia in pull request 13084. GitHub-5129

RequireJS loading issues that occur when ad blockers are active have been resolved. Previously, uBlock (or any ad blocker) forbade the trackingCode.js file from loading, which prompted RequireJS to throw an exception. This exception broke the JavaScript execution flow and caused unexpected issues throughout the storefront. Fix submitted by Yonn Trimoreau in pull request 13061.

continue() has been removed from templates. Fix submitted by Ihor Sviziev in pull request 13076.

The comment that marks the \Magento\Checkout\Model\Cart class as deprecated now includes a pointer to an alternative class. This fix is part of an ongoing effort to add pointers to valid replacements when marking methods and classes as deprecated. Fix submitted by Fabian Schmengler in pull request 13061. GitHub-10133

A new file (CODE_OF_CONDUCT.md) that defines standards for how to engage in the community has been added. Fix submitted by Ievgen Shakhsuvarov in pull request 12723.

We’ve resolved naming collisions that previously occurred in the Javascript UI registry. Previously, these naming collisions resulted in the following behaviors: Magento displayed the element.disabled is not a function message, and did not create product variations as expected. GitHub-12555

Newsletters

The About Us and Customer Service links of the Order Confirmation email (and other emails sent to the customer) now work as expected. Fix submitted by Roman K. in pull request. GitHub-12261

Magento now sends the newsletter subscription success email as expected when a customer successfully subscribes to a newsletter. Fix submitted by Styopchik in pull request. GitHub-12439

Magento now uses indexes to retrieve subscriber information during the creation of email to newsletter subscribers. Previously, Magento did not use indexes for this task, and performance was poor. Fix submitted by Amit Bera in pull request. GitHub-12787

The text of the Subscribe to Newsletter button now wraps correctly. Fix submitted by monaemipro in pull request 13041. GitHub-12320

Orders

Magento now shows all products as expected in the Recently Ordered list when a customer places an order that contains products from multiple stores. Previously, in installations with two storefronts, if a customer added products from both stores to the same shopping cart, and placed a single order, the recently ordered product list would not show all ordered products.

The getDefaultStoreLocale() method has been added to allow for the fetching of scoped values. Use this method in getCreatedAtFormatted() to ensure that Magento translates the created_at order date in emails for the locale being used in that store view. Fix submitted by Jeroen in pull request 11067.

You can now successfully open the Order edit page for orders that contain an address with extension attributes. Previously, when you tried to open this page, the page load failed with this error, Recoverable Error: Object of class Magento\Sales\Api\Data\OrderAddressExtension could not be converted to string in .../module-sales/Model/AdminOrder/Create.php on line 503.

Magento now saves an invoice ID on the credit memo when you create a credit memo from the invoice in the Admin. Previously,
the invoice ID was not included. Fix submitted by Anton Evers in pull request 11067. GitHub-11669

Credit memos can have the state open (\Magento\Sales\Model\Order\Creditmemo::STATE_OPEN). As a result, you can create a credit memo with an ID that still has to be refunded, and existing credit memos should be refundable if their state is open. Fix submitted by Anton Evers in pull request 11550.

The Magento\Sales\Service\V1\OrderCreateTest test now has the correct shipping method fixture. Previously, this test contained an incorrect shipping method fixture, which produced an error whenever an order’s shipping method was treated an object. Fix submitted by andrew-garside-temando in pull request 12227.

When you create a credit memo comment with POST /V1/creditmemo/:id/comments, Magento now sends credit memo update emails as expected. Previously, Magento did not send this email, and no other transaction emails were sent to the customer.

The getReservedOrderId() method now uses the current store as expected instead of the default store. Fix submitted by Timon de Groot in pull request 11702. GitHub-9055

When you are editing an order’s shipping or billing address, Magento now displays the allowed countries from the correct store view. Previously, possible addresses were derived from the wrong store view. Fix submitted by Roman K. in pull request. GitHub-12560

The \Magento\Sales\Model\Order\Pdf\AbstractPdf::drawLineBlocks method now works as expected. Previously, when a text block spanned more than one page, Magento threw a Zend_Pdf_Exception error, and displayed this error: Font has not been set. Fix submitted by Serhii in pull request 1016. GitHub-11743

You can now place orders using PayPal when Payment Action = Order. Previously, when Payment Action = Order, Magento displayed this error when you reached the order review page: We can't place the order.

The cancel order and restore quote methods now accurately calculate the amount of stock to be returned to inventory when an order is canceled. Previously, when you canceled an order, some of these methods did not accurately calculate the amount of restored stock. Fix submitted by Danny Verkade in pull request 12668. GitHub-9969

Join extension attributes are now added as expected to order results when the order is created using REST. Fix submitted by Nickolas Malyovanets in pull request 1168.

The Shipment Tracking REST API now throws an error as expected if the specified order doesn’t exist. Fix submitted by Roman K. in pull request 1162.

Invoices now display the exact quantity of a product ordered, even if it is a fractional unit (for example, 6.5). Previously, when Magento tried to invoice an order that had products with quantities that required decimals, it rounded down the quantity to the nearest whole number in the invoice. Fix submitted by Nickolas Malyovanets in pull request 11997. GitHub-11941

Payment methods

The multishipping checkout flow now supports the CyberSource payment method. This payment method is supported on Magento Commerce only. However, as part of the process of adding CyberSource support, we’ve made improvements to the Multishipping module to simplify integration process for other payment methods.

Users of the CyberSource payment method should note that that CyberSource uses the Magento Vault module only to store and retrieve tokens. Stored CyberSource tokens won’t be displayed on the checkout page or customer account.

Logged-out customers can no longer see previously saved credit cards. Previously, users logged in as guest could see some payment information from an earlier, canceled order.

Third-party developers can now customize payment errors messages for payment integrations based on the Magento Payment Provider Gateway.

PayPal Express Checkout now appears as a payment option on the Checkout page when the PayPal buttons are available on the shopping cart page. Previously, PayPal did not appear as a payment method on the Checkout page when the billing agreement was disabled, although the PayPal buttons were still available on the shopping cart page.

You can now view order details for an order created with a custom offline payment method. Previously, Magento displayed PHP warning (undefined index) instead of the order details. Fix submitted by Alex in pull request 12296. GitHub-3596

Magento no longer disables the BrainTree Place Order button after a failed payment validation. Fix submitted by Ievgen Sentiabov in pull request 12902.

The is_active and is_visible columns now default to true even when column default values are not set in the vault_payment_token installation script. Fix submitted by helloitsluke in pull request 12965.

If you’ve chosen a custom payment method that is offline when you create an order, Magento now displays that payment method’s name as expected when you view order details in Payment & Shipping. Fix submitted by zamoroka in pull request 12731. GitHub-12209

PayPal now works as expected with virtual products such as gift cards. Previously, when you tried to place an order for a virtual product using PayPal, Magento did not display the PayPal popup when you clicked Continue PayPal during checkout.

Magento now correctly adds checkout agreements data to requests and validates payment information when you place an order using PayPal Express. Previously, you could check this box, but Magento did not parse the agreements data or pass it to the set-payment-information API. This failure in turn triggered the CheckoutAgreements validation plugin, which failed to validate. Fix submitted by Ričards Zālītis in pull request 12401.

Magento no longer archives active orders that are placed using PayPal Express Checkout. Previously, if you placed an order using PayPal Express Checkout, Magento would place the order as expected but also add it to the list of archived orders.

Magento now correctly displays transparent PNG watermarks on JPEG images. Previously, Magento did not correctly display a transparent watermark as expected on an image, but instead displayed a white outline of the box where the watermark should be. Fix submitted by Elze Kool in pull request 11060. GitHub-10661

We’ve improved the display of the Payment Methods section of the checkout page on mobile devices. Previously, the layout of page elements was not correctly spaced. Fix submitted by Marcin Kwiatkowski in pull request 13777.
GitHub-13315

Magento now correctly updates the credit memo total when a merchant issues a refund. Fix submitted by Serhii in pull request 1185. GitHub-11798

Performance

The addition of a cache for the getimagesize() function has improved product image loading.

Each cache type now has its own separate cache storage.

We’ve optimized the initialization of the Product View block, which gives an 11% performance improvement for simple product views.

Magento now caches search results for faster response time on popular searches. A system administrator can configure how many top search queries can be cached. This enhancement can result in up to a 36% improvement for cacheable search terms.

Quote

If a customer changes the currency type of his order-in-progress while viewing the shopping cart, Magento displays a message that shows the minimum order necessary in the new currency. Previously, this minimum was calculated incorrectly. Fix submitted by Neeta Kangiya in pull request 13039.

Magento no longer truncates very long telephone numbers in the order page. Previously, Magento cut off very long phone numbers at 20 digits. Fix submitted by Danny Verkade in pull request 13015. GitHub-10869

You can now implement a product attribute that sets Catalog Input Type for Store Owner equal to Fixed Product Tax in a multistore environment. Fix submitted by Danny Verkade in pull request 13019.
GitHub-12393

When a customer is on the payment page and tries to reorder or retrace her steps backward through the checkout process, Magento now displays all the relevant shipping methods. Previously, Magento displayed only one shipping method under these circumstances.

An integrity constraint violation error no longer occurs after you reorder a product with custom options. Fix submitted by Vinay Shah in pull request 13036. GitHub-12705

Reports

The Products in Cart report is now accurate. Previously, if you created a Products in Cart report (Open Reports > Marketing > Products in Cart) after deleting a product from the catalog, the report displayed a blank list of products. Fix submitted by angelo983 in pull request 12539.

You can now successfully export the Ordered Products report to a CSV file. Previously, the export file contained no report data.

SalesRule

Cart prices now displays the Cart Price Rule shipping discount correctly. Previously, when you placed an order, Magento displayed this error: Payment method is not available.

Magento now displays the exact label value that was given in the Admin during the cart price rule creation. Fix submitted by Ihor Sviziev in pull request 13141. GitHub-11428, GitHub-11497

Magento now correctly displays in Cart Price rules the nesting levels for categories with nesting levels that exceed three levels.

Coupon codes that a customer has applied to a subsequently canceled order are now available for re-use as expected. Previously, once a customer canceled this order, she could not apply the coupon code to another order. Fix submitted by p-bystritsky in pull request. GitHub-12817

Shipping

The handling fee configuration of shipping methods is now explicitly cast to 0 to avoid warnings from PHP 7.1. Fix submitted by Fabian Schmengler in pull request 13680.

Unused count($_items) in templates have been removed. Fix submitted by Alexander Shkurko in pull request 12901.

Magento now enforces the minimum order amount during checkout as expected. Previously, you could bypass the minimum order amount logic by clicking Check Out with Multiple Addresses, removing products from the order,and then clicking Update Qty & Addresses. Fix submitted by Roman K. in pull request 963.

DHL product codes now match those published in the latest DHL products and services guide. Previously, three DHL product codes in the DHL Shipping module were incorrect. Fix submitted by gwharton in pull request 12666.

Sitemap

Sitemaps generated in a multi-store environment now include the correct URLs for each store (that is, http://storename.com/ instead of http://defaultstore.com/). Fix submitted by Roman K. in pull request 935. GitHub-12482

Magento now handles errors that occur during sitemap generation in a less intrusive way. If Magento throws an exception when generating a sitemap, it now sends the errors through email as configured in the sitemap configuration XML. The former _translateModel property is not used anymore, and the inline translation is correctly suspended using the inlineTranslation property instead. Fix submitted by Marina Gociu in pull request. GitHub-10502

Swagger

The code formatting in the Swagger block and template has been updated. Fix submitted by Jeroen in pull request 13485.

Swatches

You can now use REST to import visual swatch attribute options. Previously, you could not add swatch options using service contracts unless a swatch option already existed for the attribute. Fix submitted by gonzalopelon in pull request 12044. GitHub-9410, GitHub-10707, GitHub-10737, GitHub-11032

Visual swatches that have a color assigned now show that color in the swatch box. Previously, Magento did not display any color in the color swatch box. Fix submitted by Chris Pook in pull request 13101. GitHub-11828

The error message displayed when you do not supply enough information during swatch creation has been edited for clarity and grammatical accuracy. Fix submitted by Nickolas Malyovanets in pull request 1117. GitHub-5550

TargetRule

You can now successfully save a Related Product rule.

Tax

The default selector on the Admin’s tax rule edit page now selects only the correct container (tax rate) following the Tax Rate multiselect. Previously, the default selector selected three elements, which resulted in inaccurate results. Fix submitted by Pieter Hoste in pull request 13643. GitHub-12791

We’ve re-implemented tests using Jasmine as part of the process of removing the legacy JavaScript test framework and completely removing JSTestDriver support. Fix submitted by Carlos Lizaga in pull request. GitHub-12342

functional.suite.dist.yml now handles custom backend names. Previously, the value for the backend_name configuration was hardcoded. Fix submitted by scribam in pull request 12884.

The inline documentation of the static test for XSS vulnerabilities now reflects that @escapeNotVerified is disallowed in Magento versions equal or greater than 2.2. Fix submitted by Matthias Zeis in pull request 12639.

Themes

Magento no longer caches warning messages as often as a customer clicks the Update Shopping Cart button while the shopping cart page loads. Previously, Magento cached a warning message each time a customer clicked this button while the page loaded in FireFox or Chrome, and this action resulted in multiple warning messages appearing on the top of the shopping cart page.

If a customer is logged in while Magento loads, then the welcome message displays the customer’s full name. Fix submitted by Oleh Kravets in pull request 12738. GitHub-12719

Protected method getHtml now checks each child for an existing class and then appends the $outermostClass if true. Previously, when creating a dependency injection for the Magento\Theme\Block\Html\Topmenu class, you could not change class names on children in a beforeGetHtml method because getHtml declares setClass() on all child items. Fix submitted by jonshipman in pull request 12862.

Customers can now successfully close full-screen zoomed product images displayed on an iPhone 4s, 5s, 6, or 6s with the Safari browser. Previously, if a customer chose full screen zoom for any product image, he could not close the full screen zoom.

Translations and locale

Inline translations and custom translators now work for Knockout templates. Fix submitted by Dmitry Fedyuk in pull request 12953. GitHub-2156

The module responsible for generating the js-translations.json file now contains a routine that translates strings in tags such as <translate args="This won't be translated". Fix submitted by Matti Vapa in pull request 13528. GitHub-12081

User interface

You can now configure a form field with validation range words. As a result, the category name is validated, and the category is created (or displays the correct error message, if validation fails). Previously, Magento displayed an error message in the console. Fix submitted by Robin Huy in pull request 12739.

The Save Block button on the Add New Block page no longer ignores clicks if the content editor is empty.
Fix submitted by Roman K. in pull request 1032. GitHub-8114

Magento now displays video and images as expected when you select a video or click to view a full-screen image for a configurable product. Fix submitted by Chumak Roman in pull request 12469. GitHub-12268

The PHP notice that Magento displays when an invalid ui_component configuration is used has been improved. Fix submitted by Vova Yatsyuk in pull request 12239.

Magento has added verification for previously set filters in Magento/Ui/Component/Filters, which has eliminated duplication of filters in collection where conditions.

Inconsistency in the animation of the Admin spinner progress indicator has been corrected. Fix submitted by Neill Robson in pull request 13700.

URL rewrites

When using a store code in a URL, Magento now retrieves the value of Store_Code from the store if the store code value is empty. Previously, under these circumstances, Magento threw an error. Fix submitted by Oscar Recio in pull request 12529. GitHub-8615

Web API framework

You can now use the REST API to make requests that include a slash (/) in an SKU. Fix submitted by Roman K. in pull request 949. GitHub-8615

Wish list

Magento now correctly displays a product’s special price when you add it to a wish list. Previously, if you added a product with a special price to the wish list, Magento displayed the product with its regular price.

You can now remove an item description from a wish list. Fix submitted by p-bystritsky in pull request 981. GitHub-12582

Known issue

Merchants are unable to change a store view’s applied theme in Magento 2.2.4. When a merchant tries to change the Applied theme setting for a store view (Content > Design > Configuration), Magento does not change the theme, but instead displays this error: Something went wrong while saving this configuration: Area is already set. See GitHub-14968 for more information. Workaround: Merchants who are running Magento 2.2.4 should upgrade to 2.2.5, then apply patch MAGETWO-93036.

Community contributions

We are grateful to the wider Magento community and would like to acknowledge their contributions to this release.

The following table identifies contributions from our community members. This table lists the external pull requests, the GitHub issue number associated with it (if available), and the community member who contributed the pull request.