Add gift card functionality to your store:
- Buy gift cards
- Use gift cards to purchase products
- See the balance of a gift card by looking up the gift card code
The administrator will have access to a dashboard showing the total outstanding balance of gift cards which can be used for auditing.
▶▶ Skip screenshots and go to installation
Everything related to Gift Card can be done via API. Whether it is admin or shop actions
$ composer require setono/sylius-gift-card-plugin# config/packages/setono_sylius_gift_card.yaml imports: # ... - { resource: "@SetonoSyliusGiftCardPlugin/Resources/config/app/config.yaml" }If you wish to have some gift cards to play with in your application during development.
# config/packages/setono_sylius_gift_card.yaml imports: # ... - { resource: "@SetonoSyliusGiftCardPlugin/Resources/config/app/fixtures.yaml" }# config/routes.yaml setono_sylius_gift_card: resource: "@SetonoSyliusGiftCardPlugin/Resources/config/routes.yaml"or if your app doesn't use locales:
# config/routes.yaml setono_sylius_gift_card: resource: "@SetonoSyliusGiftCardPlugin/Resources/config/routes_no_locale.yaml"Make sure you add it before SyliusGridBundle, otherwise you'll get You have requested a non-existent parameter "setono_sylius_gift_card.model.gift_card.class". exception.
<?php $bundles = [ // ... Setono\SyliusGiftCardPlugin\SetonoSyliusGiftCardPlugin::class => ['all' => true], Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], // ... ];You will find the templates you need to override in the test application.
Extend Product
<?php # src/Entity/Product/Product.php declare(strict_types=1); namespace App\Entity\Product; use Doctrine\ORM\Mapping as ORM; use Setono\SyliusGiftCardPlugin\Model\ProductInterface as SetonoSyliusGiftCardProductInterface; use Setono\SyliusGiftCardPlugin\Model\ProductTrait as SetonoSyliusGiftCardProductTrait; use Sylius\Component\Core\Model\Product as BaseProduct; /** * @ORM\Entity * @ORM\Table(name="sylius_product") */ class Product extends BaseProduct implements SetonoSyliusGiftCardProductInterface { use SetonoSyliusGiftCardProductTrait; }Extend Order
<?php # src/Entity/Order/Order.php declare(strict_types=1); namespace App\Entity\Order; use Setono\SyliusGiftCardPlugin\Model\OrderInterface as SetonoSyliusGiftCardPluginOrderInterface; use Setono\SyliusGiftCardPlugin\Model\OrderTrait as SetonoSyliusGiftCardPluginOrderTrait; use Sylius\Component\Core\Model\Order as BaseOrder; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="sylius_order") */ class Order extends BaseOrder implements SetonoSyliusGiftCardPluginOrderInterface { use SetonoSyliusGiftCardPluginOrderTrait { SetonoSyliusGiftCardPluginOrderTrait::__construct as private __giftCardTraitConstruct; } public function __construct() { $this->__giftCardTraitConstruct(); parent::__construct(); } }Extend OrderItem
<?php # src/Entity/Order/OrderItem.php declare(strict_types=1); namespace App\Entity\Order; use Doctrine\ORM\Mapping as ORM; use Setono\SyliusGiftCardPlugin\Model\OrderItemTrait as SetonoSyliusGiftCardOrderItemTrait; use Sylius\Component\Core\Model\OrderItem as BaseOrderItem; /** * @ORM\Entity * @ORM\Table(name="sylius_order_item") */ class OrderItem extends BaseOrderItem { use SetonoSyliusGiftCardOrderItemTrait; }Extend OrderItemUnit
<?php # src/Entity/Order/OrderItemUnit.php declare(strict_types=1); namespace App\Entity\Order; use Doctrine\ORM\Mapping as ORM; use Setono\SyliusGiftCardPlugin\Model\OrderItemUnitInterface as SetonoSyliusGiftCardOrderItemUnitInterface; use Setono\SyliusGiftCardPlugin\Model\OrderItemUnitTrait as SetonoSyliusGiftCardOrderItemUnitTrait; use Sylius\Component\Core\Model\OrderItemUnit as BaseOrderItemUnit; /** * @ORM\Entity * @ORM\Table(name="sylius_order_item_unit") */ class OrderItemUnit extends BaseOrderItemUnit implements SetonoSyliusGiftCardOrderItemUnitInterface { use SetonoSyliusGiftCardOrderItemUnitTrait; }Extend OrderRepository:
<?php # src/Doctrine/ORM/OrderRepository.php declare(strict_types=1); namespace App\Doctrine\ORM; use Setono\SyliusGiftCardPlugin\Repository\OrderRepositoryInterface as SetonoSyliusGiftCardPluginOrderRepositoryInterface; use Setono\SyliusGiftCardPlugin\Doctrine\ORM\OrderRepositoryTrait as SetonoSyliusGiftCardPluginOrderRepositoryTrait; use Sylius\Bundle\CoreBundle\Doctrine\ORM\OrderRepository as BaseOrderRepository; class OrderRepository extends BaseOrderRepository implements SetonoSyliusGiftCardPluginOrderRepositoryInterface { use SetonoSyliusGiftCardPluginOrderRepositoryTrait; }Extend CustomerRepository:
<?php # src/Doctrine/ORM/CustomerRepository.php declare(strict_types=1); namespace App\Doctrine\ORM; use Setono\SyliusGiftCardPlugin\Repository\CustomerRepositoryInterface as SetonoSyliusGiftCardPluginCustomerRepositoryInterface; use Setono\SyliusGiftCardPlugin\Doctrine\ORM\CustomerRepositoryTrait as SetonoSyliusGiftCardPluginCustomerRepositoryTrait; use Sylius\Bundle\CoreBundle\Doctrine\ORM\CustomerRepository as BaseCustomerRepository; class CustomerRepository extends BaseCustomerRepository implements SetonoSyliusGiftCardPluginCustomerRepositoryInterface { use SetonoSyliusGiftCardPluginCustomerRepositoryTrait; }- Add configuration:
# config/services.yaml sylius_customer: resources: customer: classes: repository: App\Doctrine\ORM\CustomerRepository sylius_order: resources: order: classes: model: App\Entity\Order\Order repository: App\Doctrine\ORM\OrderRepository order_item: classes: model: App\Entity\Order\OrderItem order_item_unit: classes: model: App\Entity\Order\OrderItemUnit sylius_product: resources: product: classes: model: App\Entity\Product\ProductResources declaration that need to be copied are:
If you already have them overriden, just change the following routes:
<itemOperation name="shop_add_item"> <attribute name="method">PATCH</attribute> <attribute name="path">/shop/orders/{tokenValue}/items</attribute> <attribute name="messenger">input</attribute> <attribute name="input">Setono\SyliusGiftCardPlugin\Api\Command\AddItemToCart</attribute> <!-- This has been changed compared to the core --> <attribute name="normalization_context"> <attribute name="groups">shop:cart:read</attribute> </attribute> <attribute name="denormalization_context"> <attribute name="groups">shop:cart:add_item</attribute> </attribute> <attribute name="openapi_context"> <attribute name="summary">Adds Item to cart</attribute> </attribute> </itemOperation>$ bin/console doctrine:migrations:diff $ bin/console doctrine:migrations:migrate$ php bin/console assets:install$ php bin/console cache:clearYou can customize where you will be redirected after adding or removing a gift card. To do so, you can simply change the route configuration :
setono_sylius_gift_card_shop_remove_gift_card_from_order: path: /gift-card/{giftCard}/remove-from-order methods: GET defaults: _controller: setono_sylius_gift_card.controller.action.remove_gift_card_from_order redirect: route: sylius_shop_cart_summary parameters: []The same applies for the setono_sylius_gift_card_shop_partial_add_gift_card_to_order route
You can also override or decorate the service setono_sylius_gift_card.resolver.redirect_url to define a more custom way of redirecting
In order to find out how to use the GiftCard plugin, please refer to the usage.
$ composer testsTo run built-in application showing plugin at work, just run:
$ composer tryLearn more about our contribution workflow on http://docs.sylius.org/en/latest/contributing/.
Please, run composer all to run all checks and tests before making pull request.

