MerchantResolver::class, SectionResolver::class => SectionResolver::class, AddressContainer::class => AddressContainer::class, TaxRateContainer::class => TaxRateContainer::class, UnitContainer::class => UnitContainer::class, CreditHistoryContainer::class => CreditHistoryContainer::class, DocumentContainer::class => DocumentContainer::class, MerchantContainer::class => MerchantContainer::class, OrderPaymentContainer::class => OrderPaymentContainer::class, OrderProductContainer::class => OrderProductContainer::class, OrderProductReductionCatalogContainer::class => OrderProductReductionCatalogContainer::class, OrderProductRefundContainer::class => OrderProductRefundContainer::class, OrderReductionCartContainer::class => OrderReductionCartContainer::class, OrderReductionCreditContainer::class => OrderReductionCreditContainer::class, OrderRefundContainer::class => OrderRefundContainer::class, OrderShopContainer::class => OrderShopContainer::class, OrderStatusContainer::class => OrderStatusContainer::class, OrderStatusHistoryContainer::class => OrderStatusHistoryContainer::class, PointSaleContainer::class => PointSaleContainer::class, ProductCategoryContainer::class => ProductCategoryContainer::class, ProductContainer::class => ProductContainer::class, ProductFamilyContainer::class => ProductFamilyContainer::class, ReductionCartContainer::class => ReductionCartContainer::class, ReductionCatalogContainer::class => ReductionCatalogContainer::class, ReductionCreditContainer::class => ReductionCreditContainer::class, OpeningContainer::class => OpeningContainer::class, SectionContainer::class => SectionContainer::class, MerchantSettingContainer::class => MerchantSettingContainer::class, SectionSettingContainer::class => SectionSettingContainer::class, UserMerchantContainer::class => UserMerchantContainer::class, UserPointSaleContainer::class => UserPointSaleContainer::class, VisitorContainer::class => VisitorContainer::class ]; } public function configureResponseParameters(KeyValueStore $responseParameters): KeyValueStore { $responseParameters = parent::configureResponseParameters($responseParameters); // affichage du filtre sur section if ($this->isInstanceOf(FilterSectionInterface::class)) { $responseParameters->set('display_switch_section', true); } return $responseParameters; } public function createIndexQueryBuilder( SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters ): QueryBuilder { $queryBuilder = parent::createIndexQueryBuilder( $searchDto, $entityDto, $fields, $filters ); //TODO Gérer depuis les événements if ($this->isInstanceOf(FilterMerchantInterface::class)) { $queryBuilder->andWhereMerchant('entity', $this->get(MerchantResolver::class)->getCurrent()); } if ($this->isInstanceOf(FilterMultipleMerchantsInterface::class)) { $queryBuilder->andWhere(':merchant MEMBER OF entity.merchants'); $queryBuilder->setParameter('merchant', $this->get(MerchantResolver::class)->getCurrent()); } if ($this->isInstanceOf(FilterSectionInterface::class)) { $queryBuilder->andWhereSection('entity', $this->get(SectionResolver::class)->getCurrent()); } return $queryBuilder; } public function duplicateToOtherMerchant( AdminContext $context, EntityComponent $entityComponent, TranslatorAdmin $translatorAdmin, EntityManagerInterface $em ) { if (!$this->isGranted( Permission::EA_EXECUTE_ACTION, ['action' => "duplicate", 'entity' => $context->getEntity()] )) { throw new ForbiddenActionException($context); } if (!$context->getEntity()->isAccessible()) { throw new InsufficientEntityPermissionException($context); } if (!$this->isInstanceOf(FilterMerchantInterface::class)) { throw new \ErrorException('L\entité n\'est pas lié à un merchant.'); } $duplicateOtherMerchantForm = $this->createForm( DuplicateToOtherMerchantFormType::class, null, array( 'entityClass' => $context->getEntity()->getFqcn(), 'entityId' => $context->getEntity()->getInstance()->getId(), 'action' => $context->getRequest()->getUri(), 'attr' => ['id' => 'duplicate-other-merchant-form'], ) ); $duplicateOtherMerchantForm->handleRequest($context->getRequest()); if ($duplicateOtherMerchantForm->isSubmitted() && $duplicateOtherMerchantForm->isValid()) { $newEntity = $entityComponent->duplicateEntity($context->getEntity()->getInstance()); $em->create($newEntity); $merchant = $duplicateOtherMerchantForm->get('merchants')->getData(); $newEntity->setMerchant($merchant); $em->update($newEntity); $em->flush(); $url = $this->get(AdminUrlGenerator::class) ->setAction(ActionDefinition::EDIT) ->setEntityId($newEntity->getId()) ->generateUrl(); $this->addFlashTranslator( 'success', 'duplicateToOtherMerchant', $this->getTranslationEntityName(), ['%merchant%' => $merchant->getTitle()] ); //TODO switch merchant route return $this->redirect($url); } if ($context->getRequest()->isXmlHttpRequest()) { $response['data'] = $this->renderView( '@LcCaracole/admin/merchant/modal/duplicate_entity_to_other_merchant.html.twig', array( 'form_duplicate_entity_to_other_merchant' => $duplicateOtherMerchantForm->createView(), ) ); return new Response(json_encode($response)); } else { throw new \ErrorException('La requête doit être effectué en ajax'); } } public function duplicateToOtherSection( AdminContext $context, EntityComponent $entityComponent, TranslatorAdmin $translatorAdmin, EntityManagerInterface $em ) { if (!$this->isGranted( Permission::EA_EXECUTE_ACTION, ['action' => ActionDefinition::DUPLICATE, 'entity' => $context->getEntity()] )) { throw new ForbiddenActionException($context); } if (!$context->getEntity()->isAccessible()) { throw new InsufficientEntityPermissionException($context); } if (!$this->isInstanceOf(FilterSectionInterface::class)) { throw new \ErrorException('L\entité n\'est pas lié à un merchant.'); } $duplicateOtherSectionForm = $this->createForm( DuplicateToOtherSectionFormType::class, null, array( 'entityClass' => $context->getEntity()->getFqcn(), 'entityId' => $context->getEntity()->getInstance()->getId(), 'action' => $context->getRequest()->getUri(), 'attr' => ['id' => 'duplicate-other-section-form'], ) ); $duplicateOtherSectionForm->handleRequest($context->getRequest()); if ($duplicateOtherSectionForm->isSubmitted() && $duplicateOtherSectionForm->isValid()) { $newEntity = $entityComponent->duplicateEntity($context->getEntity()->getInstance()); $em->create($newEntity); $section = $duplicateOtherSectionForm->get('sections')->getData(); $newEntity->setSection($section); $em->update($newEntity); $em->flush(); $url = $this->get(AdminUrlGenerator::class) ->setAction(ActionDefinition::EDIT) ->setEntityId($newEntity->getId()) ->generateUrl(); $this->addFlashTranslator( 'success', 'duplicateToOtherSection', $this->getTranslationEntityName(), ['%section%' => $section->getTitle()] ); //TODO switch merchant route return $this->redirect($url); } if ($context->getRequest()->isXmlHttpRequest()) { $response['data'] = $this->renderView( '@LcCaracole/admin/merchant/modal/duplicate_entity_to_other_section.html.twig', array( 'form_duplicate_entity_to_other_section' => $duplicateOtherSectionForm->createView(), ) ); return new Response(json_encode($response)); } else { throw new \ErrorException('La requête doit être effectué en ajax'); } } public function buildIndexActions(Actions $actions): void { parent::buildIndexActions($actions); if ($this->isInstanceOf(FilterMerchantInterface::class)) { $actions->add(Crud::PAGE_INDEX, $this->getDuplicateToOhterMerchantAction()); } if ($this->isInstanceOf(FilterSectionInterface::class)) { $actions->add(Crud::PAGE_INDEX, $this->getDuplicateToOhterSectionAction()); } } public function getDuplicateToOhterMerchantAction(): Action { $duplicateAction = Action::new( ActionDefinition::DUPLICATE_TO_OTHER_MERCHANT, $this->get(TranslatorAdmin::class)->transAction(ActionDefinition::DUPLICATE_TO_OTHER_MERCHANT), 'fa fa-fw fa-copy' ) ->linkToCrudAction(ActionDefinition::DUPLICATE_TO_OTHER_MERCHANT) ->setCssClass('text-info in-dropdown duplicate-to-other-merchant duplicate-modal-action'); return $duplicateAction; } public function getDuplicateToOhterSectionAction(): Action { $duplicateAction = Action::new( ActionDefinition::DUPLICATE_TO_OTHER_SECTION, $this->get(TranslatorAdmin::class)->transAction(ActionDefinition::DUPLICATE_TO_OTHER_SECTION), 'fa fa-fw fa-copy' ) ->linkToCrudAction(ActionDefinition::DUPLICATE_TO_OTHER_SECTION) ->setCssClass('text-info in-dropdown duplicate-to-other-section duplicate-modal-action'); return $duplicateAction; } public function getCurrentSection() { return $this->get(SectionResolver::class)->getCurrent(); } public function getCurrentMerchant() { return $this->get(MerchantResolver::class)->getCurrent(); } public function getMerchantSettingCurrent(string $settingName) { return $this->getSettingValue($this->getCurrentMerchant(), $settingName); } public function getSectionSettingCurrent(string $settingName) { return $this->getSettingValue($this->getCurrentSection(), $settingName); } public function getSettingSolver(): SettingSolver { return $this->get(SettingSolver::class); } public function getSettingValue($entity, $settingName) { return $this->getSettingSolver()->getSettingValue($entity, $settingName); } }