e-commerce Bundles installation¶
Prerequisites¶
There are some Sonata dependencies that need to be installed and configured beforehand:
Follow their configuration step; you will find everything you need in their own installation chapter.
Note
If a dependency is already installed somewhere in your project or in another dependency, you won’t need to install it again.
Enable the Bundle¶
1 | composer require sonata-project/ecommerce
|
Next, be sure to enable the bundles in your bundles.php
file if they
are not already enabled:
// config/bundles.php
return [
// ...
Sonata\CustomerBundle\SonataCustomerBundle::class => ['all' => true],
Sonata\ProductBundle\SonataProductBundle::class => ['all' => true],
Sonata\BasketBundle\SonataBasketBundle::class => ['all' => true],
Sonata\OrderBundle\SonataOrderBundle::class => ['all' => true],
Sonata\InvoiceBundle\SonataInvoiceBundle::class => ['all' => true],
Sonata\DeliveryBundle\SonataDeliveryBundle::class => ['all' => true],
Sonata\PaymentBundle\SonataPaymentBundle::class => ['all' => true],
Sonata\PriceBundle\SonataPriceBundle::class => ['all' => true],
// ...
new Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
];
Note
If you are not using Symfony Flex, you should enable bundles in your
Kernel.php
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // src/Kernel.php
public function registerBundles()
{
return [
// ...
new Sonata\CustomerBundle\SonataCustomerBundle(),
new Sonata\ProductBundle\SonataProductBundle(),
new Sonata\BasketBundle\SonataBasketBundle(),
new Sonata\OrderBundle\SonataOrderBundle(),
new Sonata\InvoiceBundle\SonataInvoiceBundle(),
new Sonata\DeliveryBundle\SonataDeliveryBundle(),
new Sonata\PaymentBundle\SonataPaymentBundle(),
new Sonata\PriceBundle\SonataPriceBundle(),
// ...
new Knp\Bundle\MenuBundle\KnpMenuBundle(),
];
}
|
Configuration¶
Note
If you are not using Symfony Flex, all configuration in this section should
be added to app/config/config.yaml
.
- YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
# app/config/sonata_ecommerce.yaml sonata_media: # ... contexts: # ... product_catalog: providers: - sonata.media.provider.image formats: preview: { width: 80 , quality: 70} small: { width: 100 , quality: 70} large: { width: 500 , quality: 70} big: { width: 800 , quality: 70} sonata_category: providers: - sonata.media.provider.image formats: small: { width: 100 , quality: 70} big: { width: 500 , quality: 70} sonata_delivery: services: free_address_required: name: Free priority: 1 code: free selector: sonata.delivery.selector.default sonata_payment: services: pass: name: Pass code: pass browser: sonata.payment.browser.curl transformers: basket: sonata.payment.transformer.basket order: sonata.payment.transformer.order options: shop_secret_key: some-secret-key url_callback: sonata_payment_callback url_return_ko: sonata_payment_error url_return_ok: sonata_payment_confirmation # service which find the correct payment methods for a basket selector: sonata.payment.selector.simple # service which generate the correct order and invoice number generator: sonata.payment.generator.mysql # or sonata.payment.generator.postgres transformers: order: sonata.payment.transformer.order basket: sonata.payment.transformer.basket sonata_price: currency: EUR # Doctrine Configuration doctrine: # ... dbal: types: # ... currency: Sonata\Component\Currency\CurrencyDoctrineType
Extending the Bundle¶
At this point, the bundle is functional, but not quite ready yet. You need to generate the correct entities for all bundles:
1 2 3 4 5 6 | bin/console sonata:easy-extends:generate SonataBasketBundle --dest=src --namespace_prefix=App
bin/console sonata:easy-extends:generate SonataCustomerBundle --dest=src --namespace_prefix=App
bin/console sonata:easy-extends:generate SonataInvoiceBundle --dest=src --namespace_prefix=App
bin/console sonata:easy-extends:generate SonataOrderBundle --dest=src --namespace_prefix=App
bin/console sonata:easy-extends:generate SonataPaymentBundle --dest=src --namespace_prefix=App
bin/console sonata:easy-extends:generate SonataProductBundle --dest=src --namespace_prefix=App
|
Note
If you are not using Symfony Flex, use command without --namespace_prefix=App
.
With provided parameters, the files are generated in src/Sonata
.
Note
The command will generate domain objects in an App
namespace.
So you can point entities’ associations to a global and common namespace.
This will make Entities sharing easier as your models will allow to
point to a global namespace. For instance the basket will be
App\Sonata\BasketBundle\Entity\Basket
.
Note
If you are not using Symfony Flex, the namespace will be App\Sonata
.
Now, add the new App
Bundle into the bundles.php
:
// config/bundles.php
return [
// ...
App\Sonata\CustomerBundle\ApplicationSonataCustomerBundle::class => ['all' => true],
App\Sonata\BasketBundle\ApplicationSonataBasketBundle::class => ['all' => true],
App\Sonata\InvoiceBundle\ApplicationSonataInvoiceBundle::class => ['all' => true],
App\Sonata\OrderBundle\ApplicationSonataOrderBundle::class => ['all' => true],
App\Sonata\PaymentBundle\ApplicationSonataPaymentBundle::class => ['all' => true],
App\Sonata\ProductBundle\ApplicationSonataProductBundle::class => ['all' => true],
];
Note
If you are not using Symfony Flex, add the new App
Bundle into your
Kernel.php
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // src/Kernel.php
public function registerBundles()
{
return [
// ...
new App\Sonata\CustomerBundle\ApplicationSonataCustomerBundle(),
new App\Sonata\BasketBundle\ApplicationSonataBasketBundle(),
new App\Sonata\InvoiceBundle\ApplicationSonataInvoiceBundle(),
new App\Sonata\OrderBundle\ApplicationSonataOrderBundle(),
new App\Sonata\PaymentBundle\ApplicationSonataPaymentBundle(),
new App\Sonata\ProductBundle\ApplicationSonataProductBundle(),
// ...
];
}
|
Next, add the correct routing files:
- YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# config/routes.yaml # sonata front controller sonata_customer: resource: "@SonataCustomerBundle/Resources/config/routing/customer.xml" prefix: /shop/user sonata_basket: resource: "@SonataBasketBundle/Resources/config/routing/basket.xml" prefix: /shop/basket sonata_order: resource: "@SonataOrderBundle/Resources/config/routing/order.xml" prefix: /shop/user/invoice sonata_product_catalog: resource: "@SonataProductBundle/Resources/config/routing/catalog.xml" prefix: /shop/catalog sonata_product: resource: "@SonataProductBundle/Resources/config/routing/product.xml" prefix: /shop/product sonata_payment: resource: "@SonataPaymentBundle/Resources/config/routing/payment.xml" prefix: /shop/payment sonata_invoice: resource: "@SonataInvoiceBundle/Resources/config/routing/invoice.xml" prefix: /shop/user/invoice
Note
If you are not using Symfony Flex, routes should be added to app/config/routing.yaml
.
If you are not using auto-mapping in doctrine you will have to add it there too:
Note
If you are not using Symfony Flex, next configuration should be added
to app/config/config.yaml
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # config/packages/doctrine.yaml
doctrine:
# ...
orm:
entity_managers:
default:
mappings:
# ...
SonataProductBundle: ~
ApplicationSonataProductBundle: ~
SonataCustomerBundle: ~
ApplicationSonataCustomerBundle: ~
SonataBasketBundle: ~
ApplicationSonataBasketBundle: ~
SonataOrderBundle: ~
ApplicationSonataOrderBundle: ~
SonataInvoiceBundle: ~
ApplicationSonataInvoiceBundle: ~
|
The only thing left is to update your schema:
1 | bin/console doctrine:schema:update --force
|
Create missing contexts:
1 2 | bin/console sonata:classification:fix-context
bin/console sonata:media:fix-media-context
|
After the initial setup, you have to create a product:
Bundles Product <reference/bundles/product>