Release highlights 14.0.0

With great pleasure, we announce the release of the new version of the Shopsys Platform 14.0.0. This update is packed with innovations contributed by 12 developers. We dare to claim that this is one of the most significant versions yet.

We focused on processing feedback from implemented projects, especially regarding work on our relatively young JavaScript storefront. However, we haven’t been idle on the backend either. We completely reworked and simplified the system for recalculating product data and exporting it to Elasticsearch. These processes are now handled asynchronously using RabbitMQ. Last but not least, we dedicated ourselves to implementing functionalities that customers often demand, such as personalized search using the Luigi’s Box service.

The most significant updates in Shopsys Platform 14

Skeleton loaders on the storefront (#2863, #2906)

This change significantly enhances the browsing experience. Upon transitioning to any page, users immediately see a skeleton loader, indicating the layout of the page before the actual data is loaded.

Search using Luigi’s Box (#multiple pull requests)

Luigi’s Box is a service providing personalized suggestions, search, filtering, and recommendations for products, categories, articles, and brands on the e-shop. By integrating this tool into the platform (as a plugin), we have responded to the requests of many customers who demand personalization in their projects.

Hreflang (#2970)

Hreflang is an important piece of information for robots, with significant implications for SEO. This meta attribute contains information about language variations of the same page on different domains. In the e-shop administration, it is now possible to set which domains are language alternatives to each other, and based on this setting, hreflang meta tags are then added to the homepage, product detail, category listing, and more.

Order change logging (#2980)

It is now possible to track the history of changes to orders (and other entities). This allows administrators to easily access information about who, when, and how an order was modified.

GoPay – Payment Retry and Change (#2952)

If a customer paying via GoPay closes the payment gateway or the payment fails, they will subsequently see the option to retry the payment or change it to another one on the page with the incomplete payment. In the customer section, the customer can see the payment status for their orders and also has the option to retry or change the payment there.

Recently viewed products (#2716)

A panel displaying recently viewed products on each page allows users to quickly return to products they recently viewed. This increases user comfort and simplifies navigation across the website.

Asynchronous recalculation and export of product data (#2917)

The entire system for recalculating product visibility and availability has been significantly simplified. Developers now have a straightforward path to getting a product into a consistent state for presentation on the storefront. Recalculations and export of product data are now processed asynchronously using RabbitMQ. We have also added prioritization, so products modified by the administrator are processed in the queue before other changes e.g. transfers from the information system.

Furthermore, the implementation of a queuing system has opened the door to leveraging the power of asynchronous processing in other areas, such as sending emails or exporting orders to the Heureka service. For more information on working with queues, you can visit our documentation.

imgProxy for image manipulation (#2924)

The implementation of imgProxy brings developers almost endless possibilities for image manipulation with minimal effort. By default, we use imgProxy for dynamic resizing, eliminating the need to define image dimensions used on the backend in advance and allowing the storefront to request an image in any size. However, thanks to imgProxy, other image manipulations are also possible, such as setting compression and quality or adding watermarks.

New image gallery (#2995)

The original solution for the image gallery on the product detail page was not compatible with the aforementioned imgProxy for image manipulation. Therefore, we have created our own component, which developers have full control over. The new gallery can now fully utilize optimized images and is dynamically loaded, leading to further optimization of the product detail page.

Upgrade to PHP 8.3 (#3002)

The latest version of PHP brings further optimizations and allows us to write higher-quality code using language improvements such as support for constant typing or the #[\Override] attribute.

Cypress tests (#3023)

We use Cypress to test the storefront. In the new version, we have added several new tests covering critical parts of the application and greatly simplified the way tests are run locally. Additionally, we have added visual regression tests that use screenshots. Such tests can alert developers to unintended changes in the appearance of the pages in the project. Be sure to check out our documentation, which explains working with this tool in detail.

Error handling on the storefront (#2990, #3018, #2871)

We paid special attention to error handling within the JS storefront. We have added contextual information and the ability to set error verbosity so that developers have enough relevant information to resolve the error if it occurs. The error handling process has also been properly documented.

Universal product lists (#2901)

We have reworked the original features of product comparison and favorites into one universal implementation, eliminating duplicities in the code and simplifying maintenance for the future. At the same time, we have reflected the requirements from implemented projects, so product lists can now be restricted only to logged-in users, or multiple lists of the same type can be easily added.

Store opening hours (#2977)

We have introduced the spatie/opening-hours library, which provides a well-usable API for working with store opening hours. As a result, it is now easier to determine whether a store is open at a given moment or to implement, for example, any number of open intervals within one day. Another novelty is that each domain can now have its own time zone set, which is taken into account when displaying time information on the storefront.

Symfony toolbar on JS storefront (#2997)

The Symfony Profiler, familiar to backend developers, is now available in a limited form on the JS storefront as well, allowing direct access to profiles of individual XHR requests.

Improved triggering of XML feeds (#2922)

Generating XML feeds can now be scheduled similarly to running CRON modules. For each feed, developers can now configure allowed domains and the exact time at which the feed should be generated. Additionally, administrators now have the option to trigger feed generation outside of the configured time. Detailed information on setting options for generating XML feeds can be found in our documentation.

Above are just some of the main changes and innovations brought by the new version of the Shopsys Platform. The complete list of changes is available on our GitHub, and you can find many useful pieces of information in our documentation. For more details about the platform, visit the Shopsys Platform website. If you have any questions or suggestions, do not hesitate to contact us through our public Slack or discussions on GitHub. Your feedback is crucial to us.