Skip to content

Commit

Permalink
Add file in fixture utility system
Browse files Browse the repository at this point in the history
  • Loading branch information
lanfisis committed Aug 11, 2021
1 parent b51807a commit dba0d5a
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 0 deletions.
35 changes: 35 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,41 @@ In front :

![The GMap display](screenshots/gmap_render.png)

## File in fixtures management

In some cases you will want to add UI elements to your content fixtures which are Rich Editor fields. If you need files in your UI elements, you can use a dedicated fixture. It is used as follows.

```yaml
sylius_fixtures:
suites:
my_project:
fixtures:
my_files:
name: monsieurbiz_rich_editor_file
options:
files:
- source_path: 'src/Resources/fixtures/bar1.png'
target_path: 'image/foo/bar1.png'
- source_path: 'src/Resources/fixtures/file.pdf'
target_path: 'baz/file.pdf'
```

The exemple below will copy files to `public/media/image/foo/bar1.png` and `public/media/foo/file.pdf`.

Now you can use files in your content fixtures:

```yaml
description: |
[{
"code": "app.my_ui_element",
"data": {
"title": "My title",
"image": "/media/image/foo/bar1.png",
"file": "/media/baz/file.pdf"
}
}]
```

## Contributing

You can open an issue or a Pull Request if you want! 😘
Expand Down
75 changes: 75 additions & 0 deletions src/Fixture/FileFixture.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/*
* This file is part of Monsieur Biz' Rich Editor plugin for Sylius.
*
* (c) Monsieur Biz <sylius@monsieurbiz.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace MonsieurBiz\SyliusRichEditorPlugin\Fixture;

use MonsieurBiz\SyliusRichEditorPlugin\Uploader\FixtureFileUploaderInterface;
use Sylius\Bundle\FixturesBundle\Fixture\AbstractFixture;
use Sylius\Bundle\FixturesBundle\Fixture\FixtureInterface;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\HttpFoundation\File\UploadedFile;

final class FileFixture extends AbstractFixture implements FixtureInterface
{
/**
* @var FixtureFileUploaderInterface
*/
private FixtureFileUploaderInterface $uploader;

/**
* @param FixtureFileUploaderInterface $uploader
*/
public function __construct(FixtureFileUploaderInterface $uploader)
{
$this->uploader = $uploader;
}

/**
* @param array $options
*/
public function load(array $options): void
{
foreach ($options['files'] as $data) {
$file = new UploadedFile($data['source_path'], basename($data['source_path']));
$this->uploader->upload($file, $data['target_path']);
}
}

/**
* @return string
*/
public function getName(): string
{
return 'monsieurbiz_rich_editor_file';
}

/**
* @param ArrayNodeDefinition $optionsNode
*/
protected function configureOptionsNode(ArrayNodeDefinition $optionsNode): void
{
/** @phpstan-ignore-next-line */
$optionsNode
->children()
->arrayNode('files')
->arrayPrototype()
->children()
->scalarNode('source_path')->cannotBeEmpty()->end()
->scalarNode('target_path')->cannotBeEmpty()->end()
->end()
->end()
->end()
->end()
;
}
}
10 changes: 10 additions & 0 deletions src/Resources/config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,13 @@ imports:
- { resource: "services.yaml" }
- { resource: "sylius/ui.yaml" }
- { resource: "richeditor.yaml" }

knp_gaufrette:
adapters:
monsieurbiz_rich_editor_fixture_file:
local:
directory: '%sylius_core.public_dir%/media'
create: true
filesystems:
monsieurbiz_rich_editor_fixture_file:
adapter: 'monsieurbiz_rich_editor_fixture_file'
7 changes: 7 additions & 0 deletions src/Resources/config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,21 @@ services:
bind:
string $monsieurbizRicheditorDefaultElement: '%monsieurbiz.richeditor.config.default_element%'
string $monsieurbizRicheditorDefaultElementDataField: '%monsieurbiz.richeditor.config.default_element_data_field%'
Gaufrette\FilesystemInterface $filesystem: '@gaufrette.monsieurbiz_rich_editor_fixture_file_filesystem'

MonsieurBiz\SyliusRichEditorPlugin\Controller\:
resource: '../../Controller'
tags: ['controller.service_arguments']

MonsieurBiz\SyliusRichEditorPlugin\Fixture\:
resource: '../../Fixture'

MonsieurBiz\SyliusRichEditorPlugin\Twig\:
resource: '../../Twig'

MonsieurBiz\SyliusRichEditorPlugin\Uploader\:
resource: '../../Uploader'

monsieurbiz.richeditor.metadata_registry:
class: MonsieurBiz\SyliusRichEditorPlugin\UiElement\Metadata\Registry

Expand Down
25 changes: 25 additions & 0 deletions src/Uploader/FixtureFileUploaderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

/*
* This file is part of Monsieur Biz' Rich Editor plugin for Sylius.
*
* (c) Monsieur Biz <sylius@monsieurbiz.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace MonsieurBiz\SyliusRichEditorPlugin\Uploader;

use Symfony\Component\HttpFoundation\File\File;

interface FixtureFileUploaderInterface
{
/**
* @param File $file
* @param string $target
*/
public function upload(File $file, string $target): void;
}
66 changes: 66 additions & 0 deletions src/Uploader/FixtureFixtureFileUploader.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

/*
* This file is part of Monsieur Biz' Rich Editor plugin for Sylius.
*
* (c) Monsieur Biz <sylius@monsieurbiz.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace MonsieurBiz\SyliusRichEditorPlugin\Uploader;

use Gaufrette\FilesystemInterface;
use Symfony\Component\HttpFoundation\File\File;
use Webmozart\Assert\Assert;

final class FixtureFixtureFileUploader implements FixtureFileUploaderInterface
{
/**
* @var FilesystemInterface
*/
private FilesystemInterface $filesystem;

/**
* @param FilesystemInterface $filesystem
*/
public function __construct(FilesystemInterface $filesystem)
{
$this->filesystem = $filesystem;
}

/**
* @param File $file
* @param string $target
*/
public function upload(File $file, string $target): void
{
Assert::isInstanceOf($file, File::class);

if ($this->filesystem->has($target)) {
$this->remove($target);
}

$this->filesystem->write(
$target,
(string) file_get_contents($file->getPathname())
);
}

/**
* @param string $path
*
* @return bool
*/
public function remove(string $path): bool
{
if ($this->filesystem->has($path)) {
return $this->filesystem->delete($path);
}

return false;
}
}

0 comments on commit dba0d5a

Please sign in to comment.