Reputation: 11
I have following entities:
User
/**
* Users
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="Users\Entity\Repository\UsersRepository")
* @Annotation\Name("user")
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ClassMethods")
*/
class User
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100, nullable=false)
* @Annotation\Filter({"name":"StringTrim"})
* @Annotation\Validator({"name":"StringLength", "options":{"min":2, "max":100}})
* @Annotation\Attributes({"type":"text","class":"form-control"})
* @Annotation\Options({"label":"Full name:"})
*/
private $name;
/**
* @var User\Entity\UserItem
*
* @ORM\OneToMany(targetEntity="User\Entity\UserItem", mappedBy="user")
* @Annotation\Exclude()
*/
private $items;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Annotation\Exclude()
*/
private $id;
public function __construct()
{
$this->vessels = new ArrayCollection();
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function getName()
{
return $this->name;
}
public function getId()
{
return $this->id;
}
public function getItems()
{
return $this->items
}
public function setItems($items)
{
$this->itemr = $items;
return $this;
}
Item
/**
* Items
* @ORM\Entity
* @ORM\Table(name="items")
* @ORM\Entity(repositoryClass="User\Entity\Repository\ItemsRepository")
* @Annotation\Name("item")
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ClassMethods")
*/
class Item
{
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100, nullable=false)
* @Annotation\Filter({"name":"StringTrim"})
* @Annotation\Validator({"name":"StringLength", "options":{"min":2, "max":100}})
* @Annotation\Attributes({"type":"text","class":"form-control"})
* @Annotation\Options({"label":"Name:"})
*/
private $name;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Annotation\Exclude()
*/
private $id;
And finally entity keepeing relation between those two UserItem
/**
* UserItem
*
* @ORM\Table(name="users_items")
* @ORM\Entity(repositoryClass="User\Entity\Repository\UserItemsRepository")
* @Annotation\Name("user_item")
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ClassMethods")
*/
class UserItem{
/**
* @var Users\Entity\User
*
* @ORM\ManyToOne(targetEntity="Users\Entity\User", inversedBy="items")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* @Annotation\Exclude()
*/
private $user;
/**
* @var User\Entity\Item
*
* @ORM\ManyToOne(targetEntity="User\Entity\Item", inversedBy="users")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id")
* @Annotation\Type("DoctrineModule\Form\Element\ObjectSelect")
*/
private $item;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Annotation\Exclude()
*/
private $id;
With this entities i can create and edit User and Item. Form are generated from annotations. My question is how can i generate form for assigning items to user. Preferably as select field(s) with multiple selection. And after submitting doctrine should save the relations.
I wrote this form to represent items to select:
class ItemsForm extends Form
{
public function __construct($entityManager, $name = null)
{
parent::__construct('items');
$this->setAttribute('method', 'post');
$this->add(array(
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'name' => 'items',
'attributes' => array(
'id' => 'selectItems',
'multiple' => true,
'data-placeholder' => 'Items'
),
'options' => array(
'object_manager' => $entityManager,
'target_class' => 'User\Entity\Item',
'property' => 'name',
),
)
);
}
}
And now i do not know how to preselect items user has already assigned.
Upvotes: 0
Views: 955
Reputation: 466
In select field in value you must have id from items. After submit you can do something like that
foreach($post['items'] as $itemId)
{
$userItem = new UserItem();
$userItem->user = $this->getEntityManager()->getReference('User', $userId);
$userItem->item = $this->getEntityManager()->getReference('Item', $itemId);
$this->getEntityManager()->save($userItem);
}
Upvotes: 0