phpsymfonycontrollercrudeasyadmin

EasyAdmin 3.1 CrudControllers Symfony


I have problems setting up my Crud Controller's association fields. I want to only see users of a certain ROLE_ in the klient_id_klienta field and I don't know how to set it up.

Here is my CrudController:

class AdresKlientaCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return AdresKlienta::class;
    }

    /*
    public function configureFields(string $pageName): iterable
    {
        return [
            IdField::new('id'),
            TextField::new('title'),
            TextEditorField::new('description'),
        ];
    }
    */

//    public function configureFields(string $pageName): iterable
//    {
//        return [
//            'id',
//            'klient_id_klienta',
//            'miejscowosc',
//            'ulica',
//            'nr_domu',
//            'nr_lokalu',
//            'kod_pocztowy'
//        ];
//    }
    public function configureFields(string $pageName): iterable
    {

        //moje
//        $qb = new QueryBuilder($this->getDoctrine()->getManager());
//        $qb->select('u')->from('User','u')->where('u.roles = ?ROLE_USER');
//
//
//        dump(EntityFilter::new('klient_id_klienta')->apply($qb));

        //koniec moje

        $foreignKey = AssociationField::new('klient_id_klienta'); //here is my problem as it shows every user
        return [
//            IdField::new('id'),
            TextField::new('miejscowosc'),
            TextField::new('ulica'),
            TextField::new('nr_domu'),
            TextField::new('nr_lokalu'),
            TextField::new('kod_pocztowy'),
            //AssociationField::new('klient_id_klienta')
            $foreignKey

        ];
    }
}

And here is the user entity

<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     */
    private $email;



    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];



    /**
     * @var string The hashed password
     * @ORM\Column(type="string")
     */
    private $password;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $surname;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $tel;


    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    /**
     * A visual identifier that represents this user.
     *
     * @see UserInterface
     */
    public function getUsername(): string
    {
        return (string) $this->email;
    }

    /**
     * @see UserInterface
     */
    public function getRoles(): array
    {
        $roles = $this->roles;
        // guarantee every user at least has ROLE_USER


        return array_unique($roles);
    }

    public function setRoles(array $roles): self
    {
        $this->roles = $roles;

        return $this;
    }

    /**
     * @see UserInterface
     */
    public function getPassword(): string
    {
        return (string) $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

    /**
     * @see UserInterface
     */
    public function getSalt()
    {
        // not needed when using the "bcrypt" algorithm in security.yaml
    }

    /**
     * @see UserInterface
     */
    public function eraseCredentials()
    {
        // If you store any temporary, sensitive data on the user, clear it here
        // $this->plainPassword = null;
    }

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

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSurname(): ?string
    {
        return $this->surname;
    }

    public function setSurname(string $surname): self
    {
        $this->surname = $surname;

        return $this;
    }

    public function getTel(): ?string
    {
        return $this->tel;
    }

    public function setTel(string $tel): self
    {
        $this->tel = $tel;

        return $this;
    }


    //moje funkcje
    public function __toString()
    {
        // TODO: Implement __toString() method.
        $userAndRole = implode($this->roles);
        return $this->email.'-'.$userAndRole;
    }
}

I only want to see users who have ROLE_USER

I tried to use filters but from what I see in Easyadmin documentation filters allow me to set up choices based what they get so that wouldnt work for me. I also tried to use QueryBuilder to get Users with certain ROLE_ and that also failed.


Solution

  • I figured it out and I want to thank you for answering. I'm posting my solution because I don't want to be one of those people who say "I figured it out" and don't post how they actually figured that out.

    public function configureFields(string $pageName): iterable
        {
            //utworzenie wyświetlania tylko tych użytkowników, którzy maja role ROLE_USER
            $association = AssociationField::new('klient_id_klienta', 'Email klienta')
                ->setFormTypeOption(
    
                        'query_builder', function (UserRepository  $userRepository){
                            return $userRepository->createQueryBuilder('u')
                                ->andWhere('u.roles LIKE :role')->setParameter('role', '%"ROLE_USER"%');
                        }
                );
            return [
    //            IdField::new('id'),
                TextField::new('miejscowosc', 'Miejscowość'),
                TextField::new('ulica', 'Ulica'),
                TextField::new('nr_domu', 'Numer domu'),
                TextField::new('nr_lokalu', 'Numer Lokalu'),
                TextField::new('kod_pocztowy', 'Kod pocztowy'),
                $association,//wywołanie klucza obcego który odfiltrowuje użytkowników
    
            ];
        }
    

    As you can see I got the users with the certain role that I wanted to get by using query builder. Amazing tool, through that query buider I can get virtually anything I want from my databases and put it in my Crud Controllers. I hope it helps someone someday.