У меня есть 2 объекта, Product и Category с двунаправленным сопоставлением ассоциаций ManyToMany, определенным ниже:
Продукт
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="products")
* @ORM\JoinTable(name="products_categories")
*/
protected $categories;
// with these accessors
public function addCategories(Collection $categories)
{
foreach ($categories as $category)
{
$this->addCategory($category);
}
return $this;
}
public function addCategory(Category $category)
{
if (!$this->categories->contains($category))
{
$this->categories->add($category);
$category->addProduct($this);
}
return $this;
}
public function removeCategories(Collection $categories)
{
foreach ($categories as $category)
{
$this->removeCategory($category);
}
return $this;
}
public function removeCategory(Category $category)
{
if ($this->categories->contains($category))
{
$this->categories->removeElement($category);
$category->removeProduct($this);
}
return $this;
}
public function getCategories()
{
return $this->categories;
}
public function setCategories($categories)
{
$this->categories = new ArrayCollection();
foreach ($categories as $category)
{
$this->addCategory($category);
}
return $this;
}
И субъект категории:
/**
* @ORM\ManyToMany(targetEntity="Product", mappedBy="categories")
*/
protected $products;
// And accessors
public function addProducts(Collection $products)
{
foreach ($products as $product)
{
$this->addProduct($product);
}
return $this;
}
public function addProduct(Product $product)
{
if (!$this->products->contains($product))
{
$this->products->add($product);
$product->addCategory($this);
}
return $this;
}
public function removeProducts(Collection $products)
{
foreach ($products as $product)
{
$this->removeProduct($product);
}
return $this;
}
public function removeProduct(Product $product)
{
if ($this->products->contains($product))
{
$this->products->removeElement($product);
}
return $this;
}
public function getProducts()
{
return $this->products;
}
public function setProducts($products)
{
$this->products = new ArrayCollection();
foreach ($products as $product)
{
$this->addProduct($product);
}
return $this;
}
Проблема в следующем: в форме ZF2 выберите несколько, чтобы выбрать категории для продуктов, я не могу удалить последнюю запись или удалить все записи...
Один за другим он работает, за исключением последнего.
Правка Если я удалю все элементы, removeCategories() не вызывается.
Любая помощь приветствуется
Изменить 2
Я нашел очень ошеломляющее решение, чтобы обойти ошибку...
Фактически, когда множественный выбор пуст, он исчезает из переменной $ _POST... Итак, в моем контроллере Product в editAction() я делаю этот тест:
if (!isset($_POST['main']['categories']))
{
$product->getCategories()->clear();
}
Я не считаю этот хак хорошим решением.
Итак, если у кого-то есть лучшее решение, я жду ответа. TY
Это возможная ошибка в ZF, см.
https://github.com/zendframework/zf2/issues/4492
и PR с исправлением:
https://github.com/zendframework/zf2/pull/7447
Ваше решение в разделе " Редактировать 2 " - это то же обходное решение, которое я использую в своем коде до тех пор, пока не будет выпущено исправление.
Zend\Form\Element\Collection
. Но Zend\Form\Element\Select
с несколькими свойствами
Zend\Form\Form::prepareBindData
. Если вы публикуете, вы выбираете элемент пустым, в $ _POST нет данных для этого элемента, и он пропускается из-за гидратации. Вот почему не removeCategories
ваш метод removeCategories
.
Как сказано в комментариях выше, переопределение Form-> prepareBindData - это решение.
class MyForm extends Form
{
...
protected function prepareBindData(array $values, array $match)
{
return $values;
}
}