Blog

Welcome to our blog, where we share news related to Sylius and post about technology & eCommerce.

Sylius v0.17.0 with last big features

By Paweł Jędrzejewski | 04/03/2016

Hello Sylius Community!

Last few weeks have been crazy productive and we have managed to pretty much close Sylius feature set for 1.0.

Overview

The new release is exactly 921 commits from 20 contributors, which is really impressive since it is our fastest release ever.

There are several big new features and improvements worth mentioning:

Theming

Sylius supports multiple channels. There are many ways to benefit from this feature, for example having one mobile app channel (via API) and standard web shop as other one. You can also have multiple stores on a single instance, but until now there was no official way of customizing the look of individual stores.

Kamil Kokot has been working hard on our brand new ThemeBundle and he nailed it. We have a nice theming system, which supports:

  • Themes installed via Composer (they are standard packages);
  • Local themes;
  • Theme inheritance;
  • Customizable templates (both app/Resources and from Bundles);
  • Translations and assets can be overridden by theme too.

Every channel can have a Theme configured now and will render templates using particular skin.

You can find more information in the docs.

What is more, this bundle is not coupled to Sylius at all, you can use it in any Symfony project (pretty much like every Sylius bundle). Enjoy!

Product Associations

Configuring accessories, replacements, x-sells, up-sells and other product relations is a common functionality for every shop. That's why we have created a generic Association component for PHP and Symfony. Yeah, you can use it for anything - we have integrated it with our product catalog.

Workflow is quite simple, you start from defining specific association type, for example "Accessories". Then in the product form you can assign multiple products as "Accessories" of the edited product.

Great work of Łukasz Chruściel based on initial PR from Leszek Prabucki. Thank you!

Product Reviews

With Associations our product catalog has became even more powerful, but Sylius was missing pretty standard feature - product reviews.

This is fixed now with our new Review component and ReviewBundle - for integration with Symfony. These two components were joint effort started very long time ago (2013!) by Daniel Richter, continued by Mateusz Zalewski and finally completed by Grzegorz Sadowski.

You guessed it, this component is also decoupled from Sylius platform, you can implement reviews for everything, even completely unrelated to eCommerce.

SEO Metadata Management

Until v0.17.0 Sylius had no real SEO module, which would allow to easily generate titles, keywords and other important SEO values based on formulas. This is now possible thanks to new Metadata component and bundle implemented by Kamil and sponsored by REISS. Thank you!

The component is quite new and not heavily used in Sylius core, but it has great potential and we will improve it as we progress with integration in Sylius and other projects.

Behat Revolution

Apart from new features, we are reworking our Behat scenarios, because BDD in PHP has evolved a lot since we started using Behat in its very early days. The scenarios that we have written initially for Sylius were technical and coupled to UI. Based on our current state of knowledge, it is clearly quite far from true BDD we have been doing on commercial projects for a while.

You can have a look at our new scenarios here.

Our scenarios are now totally decoupled from implementation and we can test them against UI, Domain, API and CLI. Or any combination that makes sense.

Another problem was that our contexts got really fat (we have 7K steps) and had mixed responsibilities. We decided to rewrite them and treat as standard PHP objects with all dependencies injected. This required a bit of customization to Behat, which is just amazingly easy to extend through its great system of extensions.

Quick overview of our new Behat architecture:

  • todo tag for pending features;
  • domain, ui, cli, api tags added to scenarios;
  • New suites introduced, which are combination of feature set and layer of testing, for example: ui_cart, domain_cart, api_cart;
  • All Contexts are services and can have other services injected from all containers: Behat DIC, Symfony DIC and Shared Symfony DIC;
  • Each web page that we are interacting with in ui_* suites is represented by a page object, registered as a service too;
  • Quite heavy usage of Behat's transformers to simplify our step definitions.

All this allows us to better organize our Behat suite and implement features step-by-step, for example: starting from "domain" implementation, then via API and finally through UI.

Order Model Changes

Changes in Order model are quite significant, but must-have improvements. Thanks for great effort from Peter Ward, Mateusz Zalewski and Michał Marcinkowski, all money calculations on Order are now handled properly.

Quick overview of changes:

  • We introduced concept of OrderItemUnits, which replaced standard InventoryUnits in core;
  • Totals are recalculated on every add/removeItem calls, same for adding and removing adjustments on all levels;
  • Taxes are distributed to every unit purchased, so we can handle refunds more easily;
  • TaxCategory has been moved from Product to Variant, so you can tax different variants with various % rates;
  • ShippingMethod now implements TaxableInterface, so you can apply taxes to shipping.

Other Notable CHANGELOG Entries

This is gonna be little long, but all these are very significant and worth looking at, especially when upgrading!

  • #4320 Add initial admin CRUD scenarios for tax category (@pjedrzejewski)
  • #4000 [Core] [Theme] Integration with Sylius platform (@pamil)
  • #4356 CRITICAL Symfony2.8 Debug Toolbar Fix (@peteward)
  • #4328 [Customer] Added phone number to customer (@GSadee)
  • #4268 [Theme] Make themes persistable & huuuge refactoring (@pamil)
  • #4235 [Behat] [Order] Deleting an order (@lchrusciel)
  • #4296 [CoreBundle] Add enabled is true when retrieve latest products (@Niiko)
  • #4266 [Promotion] Removed "equal" flag from rules (@Zales0123)
  • #4009 [User] Remove softdeletable from User and Customer (@TheMadeleine)
  • #4257 [Behat][Promotion] Discount based on cart quantity (@Zales0123)
  • #4263 [OrderBundle] Adjustment resource (@robinjansen)
  • #4230 [Payment][Core] PaymentProcessor clean up (@lchrusciel)
  • #3980 [Review] SyliusReviewBundle (@GSadee, @Zales0123, @Richtermeister)
  • #4054 [Checkout] Behat scenarios for paypal checkout express (@Arminek)
  • #4064 [WIP][ResourceBundle] Create integration tests (@tuka217)
  • #4051 [OptionValue] Translation System (@vikey89)
  • #3992 [UserBundle] Add command to change the password of a user (@loicmobizel)
  • #4104 Make CurrencyConverter more flexible by adding possibility to convert… (@umpirsky)
  • #4167 Remove payment methods configuration (@Arminek)
  • #4111 [Sylius/Behat] Removing page objects in favour of plain old Symfony services (@pamil)
  • #4102 [Shipping] Rename ShipmentItem to ShipmentUnit (@peteward)
  • #4037 [API] [User] Customers CRUD tests (@lchrusciel)
  • #4056 [Channel] Brand new channel context! (@pamil)
  • #3915 [Core] Taxable variant (@Zales0123)
  • #4029 [Rbac] Remove softdelete interface and trait from Permission entity (@michalmarcinkowski)
  • #3165 [Association] Associated products (@lchrusciel, @l3l0)
  • #3937 Reports correct sum with currencies and label (@fcaraballo)
  • #3907 [Core] Shipment taxes (@Zales0123)
  • #3264 Introduce 3 new traits to reduce code duplication (@stloyd)
  • #3762 [ResourceBundle] New ResourceController (@pjedrzejewski, @TheMadeleine)
  • #3795 [Order] Implementation of OrderItemQuantityModifier (@Zales0123, @michalmarcinkowski)
  • #2844 [ThemeBundle] Theme bundle (@pamil, @aramalipoor)
  • #3911 [Payment] Revert payment method fee calculators (@TheMadeleine)
  • #3895 [Currency] Base currency's enabled status and exchange rate should not be editable (@TheMadeleine)
  • #3771 [RFC][Order] Introduce OrderItemUnit (@Zales0123)
  • #3696 [Addressing] Removed Address relations and introduced CodeAwareInterface (@NeverResponse)

Things coming in v0.18.x

Features introduced in v0.17.0 are last big things that land in Sylius core. We get a lot of feature requests, but now it is the time to stabilize what we have and finally release Sylius BETA. There is plenty of things I want to add to Sylius and I am confident that they will be part of future Sylius versions.

In v0.18.x we are going to focus on:

  • New admin UI, but do not worry, it won't be that big revolution in terms of code, you will be able to easily migrate your custom admin stuff to much cleaner interface and AdminBundle.
  • Grids and proper filtering support in admin panel;
  • Rewriting Behat features for the most crucial parts of the system, fixing bugs along the way;
  • Replacing WebBundle with cleaner and simpler ShopBundle;
  • Removal of soft-delete Doctrine behavior;
  • Bug fixing, bug fixing, bug fixing;
  • Documentation and DX (installer, etc.).

Installation

You can install and try the latest Sylius by running the following commands:

$ composer create-project sylius/sylius-standard my_project
$ cd my_project
$ app/console sylius:install
$ app/console server:run
$ open http://127.0.0.1:8000

Contributing

We really need your help to make the final push towards Sylius 1.0. Learn how to contribute!

Summary

I have never been more excited about Sylius development. There is still a lot of work, but now we are starting the stabilization and clean-up phase, we will be focused more on documentation, refreshing our website and on preparations for the BETA stage.

 

Get started

Create your next Symfony eCommerce project with Sylius

We provide the foundation and components needed to build applications that sell online. A cutting edge technology, loved by developers.

Get started

twitter Latest tweet

Our core team is going to #Berlin next week to take part in @codetalkshh #eCommerce & @Coding_Berlinhttps://t.co/Aa6KjiI7Oo

@Sylius 10