//TODO Gérer depuis les événements | //TODO Gérer depuis les événements | ||||
if ($this->isInstanceOf(FilterMerchantInterface::class)) { | if ($this->isInstanceOf(FilterMerchantInterface::class)) { | ||||
$queryBuilder->andWhere('entity.merchant = :merchant'); | |||||
$queryBuilder->setParameter('merchant', $this->get('merchant_resolver')->getCurrent()); | |||||
$queryBuilder->andWhereMerchant('entity', $this->get('merchant_resolver')->getCurrent()); | |||||
} | } | ||||
if ($this->isInstanceOf(FilterMultipleMerchantsInterface::class)) { | if ($this->isInstanceOf(FilterMultipleMerchantsInterface::class)) { | ||||
} | } | ||||
if ($this->isInstanceOf(FilterSectionInterface::class)) { | if ($this->isInstanceOf(FilterSectionInterface::class)) { | ||||
$queryBuilder->andWhere('entity.section = :section'); | |||||
$queryBuilder->setParameter('section', $this->get('section_resolver')->getCurrent()); | |||||
$queryBuilder->andWhereSection('entity', $this->get('section_resolver')->getCurrent()); | |||||
} | } | ||||
return $queryBuilder; | return $queryBuilder; |
namespace Lc\CaracoleBundle\Controller\Product; | namespace Lc\CaracoleBundle\Controller\Product; | ||||
//use Lc\CaracoleBundle\Field\AssociationField; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField; | use EasyCorp\Bundle\EasyAdminBundle\Field\FormField; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField; | use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField; |
<?php | |||||
namespace Lc\CaracoleBundle\Doctrine; | |||||
use Lc\SovBundle\Doctrine\EntityManager as SovEntityManager; | |||||
/** | |||||
* class EntityManager. | |||||
* | |||||
* @author La clic !!!! | |||||
*/ | |||||
class EntityManager extends SovEntityManager | |||||
{ | |||||
public function createQueryBuilder() | |||||
{ | |||||
return new QueryBuilder($this); | |||||
} | |||||
} |
<?php | |||||
namespace Lc\CaracoleBundle\Doctrine; | |||||
use Lc\SovBundle\Doctrine\QueryBuilder as SovQueryBuilder; | |||||
/** | |||||
* class EntityManager. | |||||
* | |||||
* @author La clic !!!! | |||||
*/ | |||||
class QueryBuilder extends SovQueryBuilder | |||||
{ | |||||
public function andWhereMerchant($dqlId, $merchant):self | |||||
{ | |||||
$this->andWhere($dqlId.'.merchant = :merchant'); | |||||
$this->setParameter('merchant', $merchant); | |||||
return $this; | |||||
} | |||||
public function andWhereSection($dqlId, $section):self | |||||
{ | |||||
$this->andWhere($dqlId.'.section = :section'); | |||||
$this->setParameter('section', $section); | |||||
return $this; | |||||
} | |||||
} |
<?php | |||||
namespace Lc\CaracoleBundle\Field; | |||||
use Doctrine\ORM\EntityRepository; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait; | |||||
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface; | |||||
use Lc\CaracoleBundle\Model\Section\SectionInterface; | |||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType; | |||||
final class AssociationField implements FieldInterface | |||||
{ | |||||
use FieldTrait; | |||||
public const OPTION_AUTOCOMPLETE = 'autocomplete'; | |||||
public const OPTION_CRUD_CONTROLLER = 'crudControllerFqcn'; | |||||
public const OPTION_WIDGET = 'widget'; | |||||
public const OPTION_QUERY_BUILDER_CALLABLE = 'queryBuilderCallable'; | |||||
/** @internal this option is intended for internal use only */ | |||||
public const OPTION_RELATED_URL = 'relatedUrl'; | |||||
/** @internal this option is intended for internal use only */ | |||||
public const OPTION_DOCTRINE_ASSOCIATION_TYPE = 'associationType'; | |||||
public const WIDGET_AUTOCOMPLETE = 'autocomplete'; | |||||
public const WIDGET_NATIVE = 'native'; | |||||
/** @internal this option is intended for internal use only */ | |||||
public const PARAM_AUTOCOMPLETE_CONTEXT = 'autocompleteContext'; | |||||
protected $queryBuilderParameters = array(); | |||||
/** | |||||
* @param string|false|null $label | |||||
*/ | |||||
public static function new(string $propertyName, $label = null): self | |||||
{ | |||||
return (new self()) | |||||
->setProperty($propertyName) | |||||
->setLabel($label) | |||||
->setTemplateName('crud/field/association') | |||||
->setFormType(EntityType::class) | |||||
->addCssClass('field-association') | |||||
->setCustomOption(self::OPTION_AUTOCOMPLETE, false) | |||||
->setCustomOption(self::OPTION_CRUD_CONTROLLER, null) | |||||
->setCustomOption(self::OPTION_WIDGET, self::WIDGET_AUTOCOMPLETE) | |||||
->setCustomOption(self::OPTION_QUERY_BUILDER_CALLABLE, null) | |||||
->setCustomOption(self::OPTION_RELATED_URL, null) | |||||
->setCustomOption(self::OPTION_DOCTRINE_ASSOCIATION_TYPE, null); | |||||
} | |||||
public function setFilterOnSection(SectionInterface $section): self | |||||
{ | |||||
$this->queryBuilderParameters['section'] = $section; | |||||
return $this; | |||||
} | |||||
public function setFilterOnMerchant(MerchantInterface $merchant): self | |||||
{ | |||||
$this->queryBuilderParameters['merchant'] = $merchant; | |||||
return $this; | |||||
} | |||||
public function setFilterOnDevAlias(string $devAlias): self | |||||
{ | |||||
$this->queryBuilderParameters['devAlias'] = $devAlias; | |||||
return $this; | |||||
} | |||||
public function initQueryBuilder(): self | |||||
{ | |||||
$param = $this->queryBuilderParameters; | |||||
$this->setFormTypeOption( | |||||
'query_builder', | |||||
function (EntityRepository $er) use ($param) { | |||||
$qb = $er->createQueryBuilder('e'); | |||||
if (isset($param['section'])) { | |||||
$qb->andWhereSection('e',$param['section']); | |||||
} | |||||
if (isset($param['merchant'])) { | |||||
$qb->andWhereMerchant('e',$param['merchant']); | |||||
} | |||||
/*if (isset($param['devAlias'])) { | |||||
$qb->andWhere('e.devAlias = :devAlias')->setParameter( | |||||
'devAlias', | |||||
$param['devAlias'] | |||||
); | |||||
}*/ | |||||
return $qb; | |||||
} | |||||
); | |||||
return $this; | |||||
} | |||||
public function autocomplete(): self | |||||
{ | |||||
$this->setCustomOption(self::OPTION_AUTOCOMPLETE, true); | |||||
return $this; | |||||
} | |||||
public function renderAsNativeWidget(bool $asNative = true): self | |||||
{ | |||||
$this->setCustomOption(self::OPTION_WIDGET, $asNative ? self::WIDGET_NATIVE : self::WIDGET_AUTOCOMPLETE); | |||||
return $this; | |||||
} | |||||
public function setCrudController(string $crudControllerFqcn): self | |||||
{ | |||||
$this->setCustomOption(self::OPTION_CRUD_CONTROLLER, $crudControllerFqcn); | |||||
return $this; | |||||
} | |||||
} |
<?php | |||||
namespace Lc\CaracoleBundle\Field\Configurator; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField as EaAssociationField; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldConfiguratorInterface; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Factory\EntityFactory; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Field\Configurator\AssociationConfigurator as EaAssociationConfigurator; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator; | |||||
use Lc\CaracoleBundle\Field\AssociationField; | |||||
use Symfony\Contracts\Translation\TranslatorInterface; | |||||
/** | |||||
* @author Javier Eguiluz <javier.eguiluz@gmail.com> | |||||
*/ | |||||
final class AssociationConfigurator implements FieldConfiguratorInterface | |||||
{ | |||||
private $parent; | |||||
private $entityFactory; | |||||
private $adminUrlGenerator; | |||||
private $translator; | |||||
public function __construct(EaAssociationConfigurator $associationConfigurator, EntityFactory $entityFactory, AdminUrlGenerator $adminUrlGenerator, TranslatorInterface $translator) | |||||
{ | |||||
$this->parent = $associationConfigurator; | |||||
$this->entityFactory = $entityFactory; | |||||
$this->adminUrlGenerator = $adminUrlGenerator; | |||||
$this->translator = $translator; | |||||
} | |||||
public function supports(FieldDto $field, EntityDto $entityDto): bool | |||||
{ | |||||
return AssociationField::class === $field->getFieldFqcn() || EaAssociationField::class === $field->getFieldFqcn(); | |||||
} | |||||
public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $context): void | |||||
{ | |||||
$this->parent->configure($field, $entityDto, $context); | |||||
} | |||||
} |
const PROPERTY_ORGANIC_LABEL_AB = 'ab'; | const PROPERTY_ORGANIC_LABEL_AB = 'ab'; | ||||
const PROPERTY_ORGANIC_LABEL_NP = 'nature-progres'; | const PROPERTY_ORGANIC_LABEL_NP = 'nature-progres'; | ||||
const PROPERTY_ORGANIC_LABEL_HVE = 'hve'; | const PROPERTY_ORGANIC_LABEL_HVE = 'hve'; | ||||
const PROPERTY_ORGANIC_LABEL_TRVR = 'trvr'; | |||||
const PROPERTY_ORGANIC_LABEL_TVVR = 'tvvr'; | |||||
public function getPropertyOrganicLabelChoices(): array | public function getPropertyOrganicLabelChoices(): array | ||||
{ | { | ||||
self::PROPERTY_ORGANIC_LABEL_AB, | self::PROPERTY_ORGANIC_LABEL_AB, | ||||
self::PROPERTY_ORGANIC_LABEL_NP, | self::PROPERTY_ORGANIC_LABEL_NP, | ||||
self::PROPERTY_ORGANIC_LABEL_HVE, | self::PROPERTY_ORGANIC_LABEL_HVE, | ||||
self::PROPERTY_ORGANIC_LABEL_TRVR, | |||||
self::PROPERTY_ORGANIC_LABEL_TVVR, | |||||
]; | ]; | ||||
} | } | ||||
class ProductCategoryRepository extends AbstractRepository | class ProductCategoryRepository extends AbstractRepository | ||||
{ | { | ||||
public function __construct(ManagerRegistry $registry) | public function __construct(ManagerRegistry $registry) | ||||
{ | { | ||||
parent::__construct($registry, ProductCategory::class); | parent::__construct($registry, ProductCategory::class); |
{ | { | ||||
public function filterBySection(SectionInterface $section) | public function filterBySection(SectionInterface $section) | ||||
{ | { | ||||
$this->andWhere('.section = :section')->setParameter(':section', $section); | |||||
$this->andWhereSection($this->id, $section); | |||||
} | } | ||||
} | } |
panels: | panels: | ||||
address: Adresse | address: Adresse | ||||
fields: | fields: | ||||
property: Caractéristiques | |||||
propertyValue : Valeurs | |||||
parent: Parent | parent: Parent | ||||
saleStatus: En vente | saleStatus: En vente | ||||
subtitle: Sous-titre | subtitle: Sous-titre | ||||
address: Adresse | address: Adresse | ||||
merchant: Marchand | merchant: Marchand | ||||
taxRate: Règle de taxe | taxRate: Règle de taxe | ||||
behaviorTaxRate: Avec ou sans TVA | |||||
behaviorTaxRateChoices: | |||||
tax-excluded: TVA exclue | |||||
tax-included: Tva incluse | |||||
PointSale: | PointSale: | ||||
label: Point de vente | label: Point de vente | ||||
label_plurial: Points de vente | label_plurial: Points de vente | ||||
label: Unité | label: Unité | ||||
label_plurial: Unités | label_plurial: Unités | ||||
fields: | fields: | ||||
unitChoices: | |||||
percent: Pourcentage | |||||
amount: Montant | |||||
unit: Unité | unit: Unité | ||||
wording: Nom | wording: Nom | ||||
wordingUnit: Nom long | wordingUnit: Nom long |