From bcda0896d6279fa491f9fed753c74d25d4d7ac4e Mon Sep 17 00:00:00 2001 From: Igor Mukhin Date: Tue, 19 May 2020 15:07:41 +0300 Subject: [PATCH 1/6] Fixed: Artifacts (private -> protected) --- src/Fixture/BrandFixture.php | 6 ----- src/Fixture/Factory/BrandExampleFactory.php | 30 +++++---------------- 2 files changed, 7 insertions(+), 29 deletions(-) diff --git a/src/Fixture/BrandFixture.php b/src/Fixture/BrandFixture.php index ad79f424..a4b8e8e9 100644 --- a/src/Fixture/BrandFixture.php +++ b/src/Fixture/BrandFixture.php @@ -9,17 +9,11 @@ class BrandFixture extends AbstractResourceFixture { - /** - * {@inheritdoc} - */ public function getName(): string { return 'loevgaard_sylius_brand_plugin_brand'; } - /** - * {@inheritdoc} - */ protected function configureResourceNode(ArrayNodeDefinition $resourceNode): void { $node = $resourceNode->children(); diff --git a/src/Fixture/Factory/BrandExampleFactory.php b/src/Fixture/Factory/BrandExampleFactory.php index 7846d7a1..6dc9ea07 100644 --- a/src/Fixture/Factory/BrandExampleFactory.php +++ b/src/Fixture/Factory/BrandExampleFactory.php @@ -18,13 +18,13 @@ class BrandExampleFactory extends AbstractExampleFactory { /** @var OptionsResolver */ - private $optionsResolver; + protected $optionsResolver; /** @var ProductRepositoryInterface */ - private $productRepository; + protected $productRepository; /** @var ProductsAssignerInterface */ - private $productAssigner; + protected $productAssigner; /** @var FactoryInterface */ protected $brandFactory; @@ -33,15 +33,8 @@ class BrandExampleFactory extends AbstractExampleFactory protected $productImageFactory; /** @var ImageUploaderInterface */ - private $imageUploader; - - /** - * @param ProductRepositoryInterface $productRepository - * @param ProductsAssignerInterface $productAssigner - * @param FactoryInterface $brandFactory - * @param FactoryInterface $productImageFactory - * @param ImageUploaderInterface $imageUploader - */ + protected $imageUploader; + public function __construct( ProductRepositoryInterface $productRepository, ProductsAssignerInterface $productAssigner, @@ -55,15 +48,13 @@ public function __construct( $this->productImageFactory = $productImageFactory; $this->imageUploader = $imageUploader; + $this->fileLocator = $fileLocator; $this->optionsResolver = new OptionsResolver(); $this->configureOptions($this->optionsResolver); } - /** - * {@inheritdoc} - */ protected function configureOptions(OptionsResolver $resolver): void { $resolver @@ -81,9 +72,6 @@ protected function configureOptions(OptionsResolver $resolver): void ; } - /** - * {@inheritdoc} - */ public function create(array $options = []): BrandInterface { $options = $this->optionsResolver->resolve($options); @@ -100,11 +88,7 @@ public function create(array $options = []): BrandInterface return $brand; } - /** - * @param BrandInterface $brand - * @param array $options - */ - private function createImages(BrandInterface $brand, array $options): void + protected function createImages(BrandInterface $brand, array $options): void { foreach ($options['images'] as $image) { $imagePath = $image['path']; From 58607b7fc87b06bb8e80a4c91e80f8ed8e9d8988 Mon Sep 17 00:00:00 2001 From: Igor Mukhin Date: Tue, 19 May 2020 15:08:30 +0300 Subject: [PATCH 2/6] Upgraded: Example fixtures to Sylius 1.6+ (core taxon codes changed) --- src/Resources/config/app/fixtures.yaml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Resources/config/app/fixtures.yaml b/src/Resources/config/app/fixtures.yaml index 3ecacac5..4998cb6d 100644 --- a/src/Resources/config/app/fixtures.yaml +++ b/src/Resources/config/app/fixtures.yaml @@ -2,19 +2,21 @@ sylius_fixtures: suites: default: fixtures: + product: options: custom: - product_setono_mug: - name: Setono Mug - code: setono-mug - main_taxon: mugs - taxons: [mugs] + product_setono_cap: + name: Setono Cap + code: setono-cap + main_taxon: caps + taxons: [caps] product_setono_macbook_sticker: - name: Setono Macbook Sticker - code: setono-macbook-sticker - main_taxon: stickers - taxons: [stickers] + name: Setono T-Shirt + code: setono-t_shirt + main_taxon: t_shirts + taxons: [t_shirts] + loevgaard_sylius_brand_plugin_brand: options: custom: @@ -28,8 +30,8 @@ sylius_fixtures: - type: logo path: fixtures/images/logos/setono.jpg products: - - setono-mug - - setono-macbook-sticker + - setono-cap + - setono-t_shirt brand_sylius: name: Sylius code: sylius From 10f79fe2b906b7f313e986bbb38557b9e4728d43 Mon Sep 17 00:00:00 2001 From: Igor Mukhin Date: Tue, 19 May 2020 15:11:30 +0300 Subject: [PATCH 3/6] Added: Ability to provide 3rd party images at brand images paths at fixtures --- README.md | 8 ++++++-- src/Fixture/Factory/BrandExampleFactory.php | 11 ++++++++++- src/Resources/config/app/fixtures.yaml | 8 +++----- src/Resources/config/services/fixture.xml | 1 + .../fixtures/images/logos/setono-borderless.png | Bin 0 -> 39077 bytes .../Resources}/fixtures/images/logos/setono.jpg | Bin .../Resources}/fixtures/images/logos/sylius.png | Bin 7 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/Resources/fixtures/images/logos/setono-borderless.png rename {tests/Application => src/Resources}/fixtures/images/logos/setono.jpg (100%) rename {tests/Application => src/Resources}/fixtures/images/logos/sylius.png (100%) diff --git a/README.md b/README.md index 181168ff..9e7609f8 100644 --- a/README.md +++ b/README.md @@ -228,8 +228,12 @@ $ php bin/console doctrine:migrations:migrate name: 'My brand' code: 'my-brand' images: - - type: logo - path: logos/my-brand.jpg + local_image: + type: logo + path: images/my-brand/logo.jpg + 3rd_party_plugin_image: + type: black-and-white + path: '@SomePlugin/images/my-brand/black-and-white.jpg' products: - product_code_1 - product_code_2 diff --git a/src/Fixture/Factory/BrandExampleFactory.php b/src/Fixture/Factory/BrandExampleFactory.php index 6dc9ea07..bc3e872c 100644 --- a/src/Fixture/Factory/BrandExampleFactory.php +++ b/src/Fixture/Factory/BrandExampleFactory.php @@ -12,6 +12,7 @@ use Sylius\Component\Core\Repository\ProductRepositoryInterface; use Sylius\Component\Core\Uploader\ImageUploaderInterface; use Sylius\Component\Resource\Factory\FactoryInterface; +use Symfony\Component\Config\FileLocatorInterface; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -35,12 +36,16 @@ class BrandExampleFactory extends AbstractExampleFactory /** @var ImageUploaderInterface */ protected $imageUploader; + /** @var FileLocatorInterface */ + protected $fileLocator; + public function __construct( ProductRepositoryInterface $productRepository, ProductsAssignerInterface $productAssigner, FactoryInterface $brandFactory, FactoryInterface $productImageFactory, - ImageUploaderInterface $imageUploader + ImageUploaderInterface $imageUploader, + FileLocatorInterface $fileLocator ) { $this->productRepository = $productRepository; $this->productAssigner = $productAssigner; @@ -94,6 +99,10 @@ protected function createImages(BrandInterface $brand, array $options): void $imagePath = $image['path']; $imageType = $image['type'] ?? null; + $imagePath = $this->fileLocator->locate($imagePath); + if (is_array($imagePath)) { + $imagePath = $imagePath[array_key_first($imagePath)]; + } $uploadedImage = new UploadedFile($imagePath, basename($imagePath)); /** @var BrandImageInterface $brandImage */ diff --git a/src/Resources/config/app/fixtures.yaml b/src/Resources/config/app/fixtures.yaml index 4998cb6d..dc7daa39 100644 --- a/src/Resources/config/app/fixtures.yaml +++ b/src/Resources/config/app/fixtures.yaml @@ -25,10 +25,8 @@ sylius_fixtures: code: setono images: - type: logo - path: fixtures/images/logos/setono.jpg - - path: fixtures/images/logos/setono.jpg - - type: logo - path: fixtures/images/logos/setono.jpg + path: '@LoevgaardSyliusBrandPlugin/Resources/fixtures/images/logos/setono.jpg' + - path: '@LoevgaardSyliusBrandPlugin/Resources/fixtures/images/logos/setono-borderless.png' products: - setono-cap - setono-t_shirt @@ -37,4 +35,4 @@ sylius_fixtures: code: sylius images: - type: logo - path: fixtures/images/logos/sylius.png + path: '@LoevgaardSyliusBrandPlugin/Resources/fixtures/images/logos/sylius.png' diff --git a/src/Resources/config/services/fixture.xml b/src/Resources/config/services/fixture.xml index f05cbbe2..709875c6 100644 --- a/src/Resources/config/services/fixture.xml +++ b/src/Resources/config/services/fixture.xml @@ -20,6 +20,7 @@ + diff --git a/src/Resources/fixtures/images/logos/setono-borderless.png b/src/Resources/fixtures/images/logos/setono-borderless.png new file mode 100644 index 0000000000000000000000000000000000000000..791fe55f024b710a92a88b00287014eab763e2f9 GIT binary patch literal 39077 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 Date: Tue, 19 May 2020 15:30:16 +0300 Subject: [PATCH 4/6] Collapsed: Screenshots to make README prettiest --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 9e7609f8..1b157c0f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ If you want to add a brand to your products this is the plugin to use. Use cases ## Screenshots +
CLICK TO SEE + Menu: ![Screenshot showing admin menu](docs/images/admin-menu-with-brand.png) @@ -33,6 +35,8 @@ Products admin pages: ![Screenshot showing brand tab at product admin update page](docs/images/admin-product-update-tab-brand.png) +
+ ## Installation ### Step 1: Download the plugin From 3e7ea96be3331eed00c4d664ba37155de1cfec6a Mon Sep 17 00:00:00 2001 From: Igor Mukhin Date: Tue, 19 May 2020 15:35:56 +0300 Subject: [PATCH 5/6] Added: Brand aware related fixtures traits --- src/Fixture/BrandAwareFixtureTrait.php | 18 ++++++++ src/Fixture/BrandsAwareFixtureTrait.php | 18 ++++++++ .../Factory/BrandAwareExampleFactoryTrait.php | 36 +++++++++++++++ .../BrandsAwareExampleFactoryTrait.php | 46 +++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 src/Fixture/BrandAwareFixtureTrait.php create mode 100644 src/Fixture/BrandsAwareFixtureTrait.php create mode 100644 src/Fixture/Factory/BrandAwareExampleFactoryTrait.php create mode 100644 src/Fixture/Factory/BrandsAwareExampleFactoryTrait.php diff --git a/src/Fixture/BrandAwareFixtureTrait.php b/src/Fixture/BrandAwareFixtureTrait.php new file mode 100644 index 00000000..ae4cd47f --- /dev/null +++ b/src/Fixture/BrandAwareFixtureTrait.php @@ -0,0 +1,18 @@ +children() + ->scalarNode('brand') + ; + } +} diff --git a/src/Fixture/BrandsAwareFixtureTrait.php b/src/Fixture/BrandsAwareFixtureTrait.php new file mode 100644 index 00000000..a952f0cf --- /dev/null +++ b/src/Fixture/BrandsAwareFixtureTrait.php @@ -0,0 +1,18 @@ +children() + ->arrayNode('brands')->scalarPrototype() + ; + } +} diff --git a/src/Fixture/Factory/BrandAwareExampleFactoryTrait.php b/src/Fixture/Factory/BrandAwareExampleFactoryTrait.php new file mode 100644 index 00000000..4563053c --- /dev/null +++ b/src/Fixture/Factory/BrandAwareExampleFactoryTrait.php @@ -0,0 +1,36 @@ +brandRepository = $brandRepository; + } + + protected function configureBrandOptions(OptionsResolver $resolver, int $chanceOfRandomBrand = 90): void + { + $resolver + ->setDefault('brand', LazyOption::randomOneOrNull($this->brandRepository, $chanceOfRandomBrand)) + ->setAllowedTypes('brand', ['null', 'string', BrandInterface::class]) + ->setNormalizer('brand', LazyOption::findOneBy($this->brandRepository, 'code')) + ; + } + + protected function setBrandField(BrandAwareInterface $brandAware, array $resolvedOptions = []): void + { + $brandAware->setBrand($resolvedOptions['brand']); + } +} diff --git a/src/Fixture/Factory/BrandsAwareExampleFactoryTrait.php b/src/Fixture/Factory/BrandsAwareExampleFactoryTrait.php new file mode 100644 index 00000000..38c41105 --- /dev/null +++ b/src/Fixture/Factory/BrandsAwareExampleFactoryTrait.php @@ -0,0 +1,46 @@ +brandRepository = $brandRepository; + if (null === $this->faker) { + $this->faker = \Faker\Factory::create(); + } + } + + protected function configureBrandsOptions(OptionsResolver $resolver, int $amount = 10): void + { + $resolver + ->setDefault('brands', LazyOption::randomOnes($this->brandRepository, $amount)) + ->setAllowedTypes('brands', ['array']) + ->setNormalizer('brands', LazyOption::findBy($this->brandRepository, 'code')) + ; + } + + protected function setBrandField(BrandAwareInterface $brandAware, array $resolvedOptions = []): void + { + $brand = $this->faker->randomElement($resolvedOptions['brands']); + Assert::isInstanceOf($brand, BrandInterface::class); + + $brandAware->setBrand($brand); + } +} From c86d1f6d9d66adcea0f6c4ec3caf947a428e5a84 Mon Sep 17 00:00:00 2001 From: Igor Mukhin Date: Tue, 19 May 2020 16:38:47 +0300 Subject: [PATCH 6/6] Fixed: Example image path at README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b157c0f..52ed67f3 100644 --- a/README.md +++ b/README.md @@ -237,7 +237,7 @@ $ php bin/console doctrine:migrations:migrate path: images/my-brand/logo.jpg 3rd_party_plugin_image: type: black-and-white - path: '@SomePlugin/images/my-brand/black-and-white.jpg' + path: '@SomePlugin/Resources/images/my-brand/black-and-white.jpg' products: - product_code_1 - product_code_2