Skip to content

Commit

Permalink
Merge pull request #4 from asdoria/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
Asdoria authored Jan 26, 2022
2 parents d3b2178 + 71f56a4 commit be3e069
Show file tree
Hide file tree
Showing 33 changed files with 434 additions and 153 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class Product extends BaseProduct
## Usage

1. In the back office, under `Catalog`, enter `Pictogram Groups`. Create a group using a unique code
2. In `Pictogram Groups`, click `Modify Pictograms` to create/delete images for this group
2. In `Pictogram Groups`, click `Managing Pictograms` to create/delete images for this group
3. Go to a product's edit page, then click the `Pictograms` tab in the sidebar. Here you can toggle which pictograms you wish to display


Expand Down
16 changes: 9 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
{
"name": "asdoria/sylius-pictogram-plugin",
"type": "sylius-plugin",
"description": "Pictogram Bundle for Asdoria",
"keywords": [
"sylius",
"sylius-plugin"
],
"description": "A Pictogram plugin for Sylius",
"keywords": ["asdoria", "sylius", "sylius-plugin", "monofony", "pictogram"],
"authors": [
{
"name": "Asdoria",
Expand Down Expand Up @@ -53,9 +50,10 @@
},
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
"dev-master": "0.1.0-dev"
}
},
"prefer-stable": true,
"autoload": {
"psr-4": {
"Asdoria\\SyliusPictogramPlugin\\": "src/"
Expand All @@ -75,6 +73,10 @@
],
"post-create-project-cmd": [
"php bin/create_node_symlink.php"
]
],
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
}
}
}
10 changes: 10 additions & 0 deletions recipes/0.1.0/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"bundles": {
"Asdoria\\SyliusPictogramPlugin\\AsdoriaSyliusPictogramPlugin": [
"all"
]
},
"copy-from-recipe": {
"config/": "%CONFIG_DIR%/"
}
}
2 changes: 2 additions & 0 deletions recipes/0.1.0/packages/asdoria_sylius_pictogram_plugin.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
imports:
- { resource: "@AsdoriaSyliusPictogramPlugin/Resources/config/config.yaml"}
3 changes: 3 additions & 0 deletions recipes/0.1.0/routes/asdoria_sylius_pictogram_plugin.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
asdoria_sylius_pictogram_plugin:
resource: "@AsdoriaSyliusPictogramPlugin/Resources/config/routing.yaml"
prefix: '/%sylius_admin.path_name%'
4 changes: 2 additions & 2 deletions src/Controller/PictogramController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

namespace Asdoria\SyliusPictogramPlugin\Controller;

use Asdoria\SyliusPictogramPlugin\Model\PictogramInterface;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
Expand Down Expand Up @@ -41,7 +41,7 @@ public function updatePositionsAction(Request $request): Response
);
}

/** @var ProductVariantInterface $pictogram */
/** @var PictogramInterface $pictogram */
$pictogram = $this->repository->findOneBy(['id' => $pictogramToUpdate['id']]);
$pictogram->setPosition((int) $pictogramToUpdate['position']);
$this->manager->flush();
Expand Down
54 changes: 54 additions & 0 deletions src/Controller/PictogramGroupController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php
declare(strict_types=1);

namespace Asdoria\SyliusPictogramPlugin\Controller;

use Asdoria\SyliusPictogramPlugin\Model\PictogramGroupInterface;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;

/**
* Class PictogramController
* @package Asdoria\SyliusPictogramPlugin\Controller
*
* @author Hugo Duval <[email protected]>
*/
class PictogramGroupController extends ResourceController
{
/**
* @throws HttpException
*/
public function updatePositionsAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::UPDATE);
$pictogramGroupsToUpdate = $request->get('pictogramGroups');

if ($configuration->isCsrfProtectionEnabled() && !$this->isCsrfTokenValid('update-pictogram-group-position', $request->request->get('_csrf_token'))) {
throw new HttpException(Response::HTTP_FORBIDDEN, 'Invalid csrf token.');
}

if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && null !== $pictogramGroupsToUpdate) {
foreach ($pictogramGroupsToUpdate as $pictogramGroupToUpdate) {
if (!is_numeric($pictogramGroupToUpdate['position'])) {
throw new HttpException(
Response::HTTP_NOT_ACCEPTABLE,
sprintf('The pictogramGroup position "%s" is invalid.', $pictogramGroupToUpdate['position'])
);
}

/** @var PictogramGroupInterface $pictogramGroup */
$pictogramGroup = $this->repository->findOneBy(['id' => $pictogramGroupToUpdate['id']]);
$pictogramGroup->setPosition((int) $pictogramGroupToUpdate['position']);
$this->manager->flush();
}
}

return new JsonResponse();
}
}
3 changes: 2 additions & 1 deletion src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
namespace Asdoria\SyliusPictogramPlugin\DependencyInjection;

use Asdoria\SyliusPictogramPlugin\Controller\PictogramController;
use Asdoria\SyliusPictogramPlugin\Controller\PictogramGroupController;
use Asdoria\SyliusPictogramPlugin\Entity\Pictogram;
use Asdoria\SyliusPictogramPlugin\Entity\PictogramGroup;
use Asdoria\SyliusPictogramPlugin\Entity\PictogramGroupTranslation;
Expand Down Expand Up @@ -69,7 +70,7 @@ private function addResourcesSection(ArrayNodeDefinition $node): void
->addDefaultsIfNotSet()
->children()
->scalarNode('model')->defaultValue(PictogramGroup::class)->cannotBeEmpty()->end()
->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
->scalarNode('controller')->defaultValue(PictogramGroupController::class)->cannotBeEmpty()->end()
->scalarNode('repository')->defaultValue(PictogramGroupRepository::class)->end()
->scalarNode('factory')->defaultValue(Factory::class)->end()
->scalarNode('form')->defaultValue(PictogramGroupType::class)->cannotBeEmpty()->end()
Expand Down
13 changes: 12 additions & 1 deletion src/Entity/PictogramGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class PictogramGroup implements PictogramGroupInterface
{
use ResourceTrait;
use PictogramsTrait;
use NamingTrait;
use CodeTrait;
use SortableTrait;

Expand All @@ -41,6 +40,18 @@ public function __construct()
$this->initializePictogramsCollection();
}

/**
* @return string|null
*/
public function __toString() {
return $this->getName();
}

public function getName(): ?string
{
return $this->getTranslation()->getName();
}

/**
* @param null|string $locale
*
Expand Down
177 changes: 177 additions & 0 deletions src/Form/DataTransformer/ProductsToPictogramGroupsTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
<?php
declare(strict_types=1);

namespace Asdoria\SyliusPictogramPlugin\Form\DataTransformer;

use App\Model\PictogramGroupInterface;
use App\Model\PictogramInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Sylius\Component\Core\Model\ProductInterface;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Product\Repository\ProductRepositoryInterface;
use Sylius\Component\Resource\Factory\FactoryInterface;
use Sylius\Component\Resource\Repository\RepositoryInterface;
use Symfony\Component\Form\DataTransformerInterface;

/**
* Class ProductsToPictogramGroupsTransformer
* @package Asdoria\SyliusPictogramPlugin\Form\DataTransformer
*
* @author Philippe Vesin <[email protected]>
*/
class ProductsToPictogramGroupsTransformer implements DataTransformerInterface
{
/** @var FactoryInterface */
private $pictogramFactory;

/** @var ProductRepositoryInterface */
private $productRepository;

/** @var RepositoryInterface */
private $pictogramGroupRepository;

/** @var Collection */
private $pictograms;

/**
* ProductsToPictogramsTransformer constructor.
*
* @param FactoryInterface $pictogramFactory
* @param ProductRepositoryInterface $productRepository
* @param RepositoryInterface $pictogramGroupRepository
*/
public function __construct(
FactoryInterface $pictogramFactory,
ProductRepositoryInterface $productRepository,
RepositoryInterface $pictogramGroupRepository
)
{
$this->pictogramFactory = $pictogramFactory;
$this->productRepository = $productRepository;
$this->pictogramGroupRepository = $pictogramGroupRepository;
}

/**
* {@inheritdoc}
*/
public function transform($pictograms)
{
$this->setPictograms($pictograms);

if (null === $pictograms) {
return '';
}

$values = [];

/** @var PictogramInterface $pictogram */
foreach ($pictograms as $pictogram) {
$values[$pictogram->getPictogramGroup()->getCode()] = $pictogram->getCode();
}

return $values;
}

/**
* {@inheritdoc}
*/
public function reverseTransform($values): ?Collection
{
if (null === $values || '' === $values || !is_array($values)) {
return null;
}

$pictograms = new ArrayCollection();
foreach ($values as $pictogramGroupCode => $productCodes) {
if (null === $productCodes) {
continue;
}

/** @var PictogramInterface $pictogram */
$pictogram = $this->getPictogramByGroupCode($pictogramGroupCode);
$this->setAssociatedProductsByProductCodes($pictogram, $productCodes);
$pictograms->add($pictogram);
}

$this->setPictograms(null);

return $pictograms;
}

/**
* @param Collection $products
*
* @return string|null
*/
private function getCodesAsStringFromProducts(Collection $products): ?string
{
if ($products->isEmpty()) {
return null;
}

$codes = [];

/** @var ProductInterface|ProductVariantInterface $product */
foreach ($products as $product) {
$codes[] = $product->getCode();
}

return implode(',', $codes);
}

/**
* @param string $pictogramGroupCode
*
* @return PictogramInterface
*/
private function getPictogramByGroupCode(string $pictogramGroupCode): PictogramInterface
{
/** @var PictogramInterface $pictogram */
foreach ($this->pictograms as $pictogram) {
if ($pictogramGroupCode === $pictogram->getPictogramGroup()->getCode()) {
return $pictogram;
}
}

/** @var PictogramGroupInterface $pictogramGroup */
$pictogramGroup = $this->pictogramGroupRepository->findOneBy([
'code' => $pictogramGroupCode,
]);

/** @var PictogramInterface $pictogram */
$pictogram = $this->pictogramFactory->createNew();
$pictogram->setPictogramGroup($pictogramGroup);

return $pictogram;
}

/**
* @param PictogramInterface $pictogram
* @param string $productCodes
*/
private function setAssociatedProductsByProductCodes(
PictogramInterface $pictogram,
string $productCodes
): void
{
$products = $this->productRepository->findBy(['code' => explode(',', $productCodes)]);

foreach ($pictogram->getProducts() as $product) {
$pictogram->removeProduct($product);
}

/** @var ProductInterface $product */
foreach ($products as $product) {
$pictogram->addProduct($product);
}
}

/**
* @param Collection|null $pictograms
*/
private function setPictograms(?Collection $pictograms): void
{
$this->pictograms = $pictograms;
}
}
2 changes: 1 addition & 1 deletion src/Menu/AdminMenuListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private function addChild(ItemInterface $item): void
->addChild('pictogram_groups', [
'route' => 'asdoria_admin_pictogram_group_index',
])
->setLabel('asdoria.ui.pictogram_groups')
->setLabel('asdoria.menu.admin.main.pictogram_groups.header')
->setLabelAttribute('icon', 'building');
}
}
5 changes: 0 additions & 5 deletions src/Model/PictogramGroupInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,6 @@ interface PictogramGroupInterface extends ResourceInterface, PictogramsAwareInte
*/
public function getName(): ?string;

/**
* @param string|null $name
*/
public function setName(?string $name): void;

/**
* @return int|null
*/
Expand Down
6 changes: 5 additions & 1 deletion src/Resources/config/app/ui.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@ sylius_ui:
template: "@AsdoriaSyliusPictogramPlugin/Admin/_javascripts.html.twig"
priority: 10


asdoria.admin.pictogram_group.index.javascripts:
blocks:
asdoria_pictogram_groups_javascripts:
template: "@AsdoriaSyliusPictogramPlugin/Admin/_javascripts.html.twig"
priority: 10

sylius.shop.product.show.content:
blocks:
Expand Down
Loading

0 comments on commit be3e069

Please sign in to comment.