Я создал класс 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;
}
И это работает, но я не могу отправить этой функции идентификатор ранее добавленных объектов и идентификатор родительского объекта.У кого-нибудь есть идеи, как это сделать?Спасибо