setEntityLabelInPlural('group_offers') ->setSearchFields(['name']) ; } public function configureFilters(Filters $filters): Filters { return $filters ->add(UuidFilter::new('id')) ->add(MyGroupFilter::new('group')) ->add(EnumFilter::new('membership', OfferTypeType::class)) ->add('name') ->add('active') ; } public function configureActions(Actions $actions): Actions { return $actions ->add(Crud::PAGE_INDEX, Action::DETAIL) ->add(Crud::PAGE_EDIT, Action::DETAIL) ->add(Crud::PAGE_EDIT, Action::INDEX) ; } public static function getEntityFqcn(): string { return GroupOffer::class; } /** * When a group admin is logged, we must restrict the groups he can access to. */ public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder { // admins can see everything $qb = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters); if ($this->authorizationChecker->isAdmin()) { return $qb; } /** @var User $user */ $user = $this->getUser(); $qb->andWhere(\sprintf('%s.group IN (:groups)', $qb->getRootAliases()[0] ?? '')) ->setParameter(':groups', $user->getMyGroupsAsAdmin()); return $qb; } public function configureFields(string $pageName): iterable { $idFIeld = IdField::new('id') ->setLabel('id') ->hideOnForm(); $groupField = AssociationField::new('group') ->setQueryBuilder(function (QueryBuilder $queryBuilder) { /** @var User $user */ $user = $this->getUser(); $qb = $queryBuilder->andWhere('entity.membership = :membership') ->setParameter('membership', GroupMembership::CHARGED); if (!$user->isAdmin()) { $qb->join('entity.userGroups', 'ug') ->andWhere('ug.membership = :userMembership') ->andWhere('ug.user = :user') ->setParameter('userMembership', UserMembership::ADMIN) ->setParameter('user', $user); } }) ->setRequired(false); $nameField = TextField::new('name'); $typeField = ChoiceField::new('type') ->setFormType(EnumType::class) ->setFormTypeOption('class', OfferType::class) ->setChoices(OfferType::getAsArray()); $priceField = MoneyField::new('price') ->setCurrencyPropertyPath('currency') ->setStoredAsCents(); $currencyField = CurrencyField::new('currency'); $activeField = BooleanField::new('active') ->setTemplatePath('easy_admin/field/boolean.html.twig') ; $createdAtField = DateTimeField::new('createdAt'); $updatedAtField = DateTimeField::new('updatedAt'); $panels = $this->getPanels(); if ($pageName === Crud::PAGE_INDEX) { return [$groupField, $nameField, $typeField, $priceField, $activeField, $createdAtField, $updatedAtField]; } if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { $typeField->setChoices(OfferType::cases()); return [ $groupField, $nameField, $typeField, $priceField, $currencyField, $activeField, ]; } // show return [ $panels['information'], $groupField, $nameField, $typeField, $priceField, $currencyField, $panels['tech_information'], $idFIeld, $updatedAtField, $createdAtField, ]; } }