Динамическая фильтрация списка форм в форме «CollectionType» в Sonata Admin - PullRequest
0 голосов
/ 11 марта 2019

Я создал класс ProductAdmin в Sonata Admin, который содержит форму «CollectionType», ссылающуюся на класс ProductHasAccessoryAdmin (продукт, содержащий субпродукты).Это выглядит так:

->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'
            )
        )

Entity / 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;
} }

Entity / 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;
}}

Проблема в том, что вНа панели «Соната», когда я добавляю какой-либо субпродукт и хочу добавить еще один, ранее добавленный продукт снова появляется в списке доступных и, следовательно, будет дублировать записи.

Я хотел бы отфильтровать форму CollectionType динамически, чтобы сделать доступнойсубпродукты не содержат продукт, который я сейчас редактирую.

Как я могу получить этот эффект?Я попытался в ProductAdmin.php совместить с функцией:

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;
}

И это работает, но я не могу отправить этой функции идентификатор ранее добавленных объектов и идентификатор родительского объекта.У кого-нибудь есть идеи, как это сделать?Спасибо

...