setono / sylius-catalog-promotion-plugin
Catalog promotion plugin for Sylius
Installs: 15 678
Dependents: 1
Suggesters: 0
Security: 0
Stars: 14
Watchers: 4
Forks: 4
Open Issues: 8
Type:sylius-plugin
Requires
- php: ^7.3
- beberlei/doctrineextensions: ^1.2
- sylius/resource-bundle: ^1.6
- symfony/config: ^4.4 || ^5.0
- symfony/lock: ^4.4 || ^5.0
- thecodingmachine/safe: ^1.1
Requires (Dev)
- phpspec/phpspec: ^6.3
- phpunit/phpunit: ^8.5
- roave/security-advisories: dev-master
- setono/code-quality-pack: ^1.5.1
- setono/sylius-behat-pack: ^0.1
- sylius/sylius: ~1.7.0
- symfony/debug-bundle: ^5.1
- symfony/dotenv: ^5.2
- symfony/intl: ^4.4 || ^5.0
- symfony/web-profiler-bundle: ^5.0
- dev-master / 1.0.x-dev
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.0
- dev-dependabot/composer/setono/sylius-behat-pack-tw-0.2
- dev-dependabot/composer/sylius/sylius-approx-1.9.0
- dev-dependabot/composer/phpunit/phpunit-tw-9.5
- dev-dependabot/composer/phpspec/phpspec-tw-7.0
- dev-add-danish-translation
- dev-refactor-command
This package is auto-updated.
Last update: 2021-03-25 04:34:46 UTC
README
Plugin for Sylius to define permanent or time-limited promotions for products and automatically update prices.
Install
Add plugin to composer.json
composer require setono/sylius-catalog-promotion-plugin
Register plugin
<?php # config/bundles.php return [ // ... Setono\SyliusCatalogPromotionPlugin\SetonoSyliusCatalogPromotionPlugin::class => ['all' => true], Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], // ... ];
Note, that we MUST define SetonoSyliusCatalogPromotionPlugin
BEFORE SyliusGridBundle
.
Otherwise you'll see exception like this:
You have requested a non-existent parameter "setono_sylius_catalog_promotion.model.promotion.class".
Add config
# config/packages/setono_sylius_catalog_promotion.yaml imports: - { resource: "@SetonoSyliusCatalogPromotionPlugin/Resources/config/app/config.yaml" } # Uncomment if you want to add some catalog promotion fixtures to default suite # - { resource: "@SetonoSyliusCatalogPromotionPlugin/Resources/config/app/fixtures.yaml" }
Add routing
# config/routes/setono_sylius_catalog_promotion.yaml setono_sylius_catalog_promotion_admin: resource: "@SetonoSyliusCatalogPromotionPlugin/Resources/config/admin_routing.yaml" prefix: /admin
Extend core classes
Extend ChannelPricing
<?php declare(strict_types=1); namespace App\Entity\Channel; use Doctrine\ORM\Mapping as ORM; use Setono\SyliusCatalogPromotionPlugin\Model\ChannelPricingInterface as CatalogPromotionChannelPricingInterface; use Setono\SyliusCatalogPromotionPlugin\Model\ChannelPricingTrait as CatalogPromotionChannelPricingTrait; use Sylius\Component\Core\Model\ChannelPricing as BaseChannelPricing; /** * @ORM\Table(name="sylius_channel_pricing") * @ORM\Entity() */ class ChannelPricing extends BaseChannelPricing implements CatalogPromotionChannelPricingInterface { use CatalogPromotionChannelPricingTrait; }
Extend ChannelPricingRepository
<?php declare(strict_types=1); namespace App\Repository; use Setono\SyliusCatalogPromotionPlugin\Doctrine\ORM\ChannelPricingRepositoryTrait as CatalogPromotionChannelPricingRepositoryTrait; use Setono\SyliusCatalogPromotionPlugin\Repository\ChannelPricingRepositoryInterface as CatalogPromotionChannelPricingRepositoryInterface; use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository; class ChannelPricingRepository extends EntityRepository implements CatalogPromotionChannelPricingRepositoryInterface { use CatalogPromotionChannelPricingRepositoryTrait; }
Extend ProductRepository
<?php declare(strict_types=1); namespace App\Repository; use Setono\SyliusCatalogPromotionPlugin\Doctrine\ORM\ProductRepositoryTrait as CatalogPromotionProductRepositoryTrait; use Setono\SyliusCatalogPromotionPlugin\Repository\ProductRepositoryInterface as CatalogPromotionProductRepositoryInterface; use Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductRepository as BaseProductRepository; class ProductRepository extends BaseProductRepository implements CatalogPromotionProductRepositoryInterface { use CatalogPromotionProductRepositoryTrait; }
Extend ProductVariantRepository
<?php declare(strict_types=1); namespace App\Repository; use Setono\SyliusCatalogPromotionPlugin\Doctrine\ORM\ProductVariantRepositoryTrait as CatalogPromotionProductVariantRepositoryTrait; use Setono\SyliusCatalogPromotionPlugin\Repository\ProductVariantRepositoryInterface as CatalogPromotionProductVariantRepositoryInterface; use Sylius\Bundle\CoreBundle\Doctrine\ORM\ProductVariantRepository as BaseProductVariantRepository; class ProductVariantRepository extends BaseProductVariantRepository implements CatalogPromotionProductVariantRepositoryInterface { use CatalogPromotionProductVariantRepositoryTrait; }
Update config with extended classes
In your config/packages/_sylius.yaml
file update the configured classes:
# config/packages/_sylius.yaml sylius_core: resources: channel_pricing: classes: model: App\Entity\ChannelPricing repository: App\Repository\ChannelPricingRepository sylius_product: resources: product: classes: repository: App\Repository\ProductRepository product_variant: classes: repository: App\Repository\ProductVariantRepository
Update your schema
Create a migration file:
$ php bin/console doctrine:migrations:diff
If you have existing discounted products you should append this line to the up
method in the migration file:
<?php namespace DoctrineMigrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; final class Version20191028134956 extends AbstractMigration { public function up(Schema $schema) : void { // The generated SQL will be here // ... // append this line $this->addSql('UPDATE sylius_channel_pricing SET manually_discounted = 1 WHERE original_price IS NOT NULL AND price != original_price'); } public function down(Schema $schema) : void { // ... } }
Execute migration file:
$ php bin/console doctrine:migrations:migrate
Install assets
bin/console sylius:install:assets
Configure CRON to run next command every minute
$ php bin/console setono:sylius-catalog-promotion:process
Notice
This plugin only works on apps installed on a single server at the moment. It uses the local filesystem to save execution data.