Autor Wątek: Filtrowanie listy formularza "CollectionType" w Sonata Admin  (Przeczytany 115 razy)

kratekk

  • Newbie
  • *
  • Wiadomości: 2
    • Zobacz profil
Witajcie, potrzebuję rozwiązania mojego problemu w Sonata Admin. Mianowicie, mam zbudowaną klasę ProduckAdmin która zawiera formularz typu "CollectionType" odnoszący się do klasy ProductHasAccessory (Produkt zawierający subprodukty). Wygląda on w ten sposób:

->add(
                'accessories',
                CollectionType::class,
                array(
                    'label' => 'Accessories',
                    'type' => AdminType::class,
                    'error_bubbling' => true,
                    'required' => false
                ),
                array(
                    'edit' => 'inline',
                    'inline' => 'table',
                    'admin_code' => 'admin.product_has_accessory',
                    'sortable' => 'sort'
                )
            )

Tak wygląda moja encja dla Product.php:

class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ProductHasAccessory", mappedBy="accessory", cascade={"ALL"}, orphanRemoval=true)
     * @Orm\OrderBy({"sort" = "ASC"})
     */
    private $accessories;

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

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

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

        return $this;
    }
public function addAccessory(\App\Entity\ProductHasAccessory $accessory)
    {
        $accessory->setProduct($this);
        $this->accessories[] = $accessory;

        return $this;
    }

    public function removeAccessory(\App\Entity\ProductHasAccessory $accessory)
    {
        $accessory->setProduct(null);
        $this->accessories->removeElement($accessory);
    }

    public function getAccessories()
    {
        return $this->accessories;
    }
}

oraz Encja dla ProductHasAccessory.php:
class ProductHasAccessory
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var int
     * @ORM\Column(name="sort", type="integer")
     */
    private $sort = 0;

    /**
     * @ORM\ManyToOne(targetEntity="Product")
     */
    private $accessory;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="accessories")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    private $product;

    public function __toString()
    {
        return (string)$this->getAccessory();
    }

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

    public function setSort($sort)
    {
        $this->sort = $sort;

        return $this;
    }

    public function getSort()
    {
        return $this->sort;
    }

    public function getAccessory()
    {
        return $this->accessory;
    }

    public function setAccessory(\App\Entity\Product $accessory = null)
    {
        $this->accessory = $accessory;

        return $this;
    }

    public function getProduct()
    {
        return $this->product;
    }

    public function setProduct(\App\Entity\Product $product = null)
    {
        $this->product = $product;

        return $this;
    }
}

Problem polega na tym że w panelu Sonata gdy dodam jakiś subprodukt i chcę dodać kolejny to ten wcześniej dodany znowu pojawia się na liście dostępnych i tym samym mogę niechcący zdublować wpisy. Chciałbym również z CollectionType przefiltrować dynamicznie dostępne subprodukty usuwając z nich produkt który obecnie edytuję. Proszę o podpowiedź jak mogę uzyskać taki efekt? Próbowałem w ProductAdmin.php kombinować z funkcją:

public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);

        $id = 1;
        if(in_array($this->getRequest()->query->get('pcode'), $codearray)) {
            $query->andWhere(
                $query->expr()->not($query->expr()->eq($query->getRootAliases()[0] . '.id', ':param'))
            );
            $query->setParameter('param', $id);
        }
        return $query;
    }

I to działa ale nie potrafię wysłać do tej funkcji id obiektów już wcześniej dodanych oraz id obiektu rodzica. Ma ktoś pomysł jak to wykonać? Dziękuję