Итак, я только что перешел на гидратный подход к формам и выглядит довольно аккуратно.Хотя у меня есть одна небольшая проблема.У меня есть две сущности Contact
и ContactSocialMediaAccount
, поэтому мне потребуется Contact->getId()
для сохранения ContactSocialMediaAccount
сущности, но каждый раз, когда я отправляю форму, она говорит, что Entity_ID
не может быть нулевым.А это Entity_ID
это ContactSocialMediaAccount
таблица.
Это таблица контактов и сущность
class Contact {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="ID")
*/
protected $ID;
/**
* @ORM\Column(
* name="FirstName",
* type="string",
* options={"default" : ""}
* )
*/
protected $FirstName = "";
public function getID($asString = false) {
return $asString ? "JOU-" . $this->ID : $this->ID;
}
public function setID($id) {
$this->ID = $id;
}
public function getFirstName() {
return $this->FirstName;
}
public function setFirstName($firstName) {
$this->FirstName = $firstName;
}
}
А это ContactSocialMediaAccount
class ContactSocialMediaAccount {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(name="ID")
*/
/**
* @ORM\ManyToOne(targetEntity="Contact")
* @ORM\JoinColumn(name="Entity_ID", referencedColumnName="ID")
*/
private $Contact;
public function getContact() {
return $this->Contact;
}
public function setContact($contact) {
$this->Contact = $contact;
return $this;
}
}
ContactFieldSet.php
public function __construct(ObjectManager $objectManager) {
parent::__construct("Contact");
$this->setHydrator(new DoctrineHydrator($objectManager));
$this->setObject(new Contact());
//rest of the fields
$socialMediaFieldset = new SocialMediaFieldset($objectManager);
$this->add([
"type" => Element\Collection::class,
"name" => "SocialMediaAccounts",
"options" => [
"count" => 5,
"should_create_template" => false,
"allow_add" => true,
"allow_remove" => false,
"target_element" => $socialMediaFieldset
]
]);
}
И ContactSocialMediaFieldset.php
public function __construct(ObjectManager $objectManager) {
parent::__construct("socialMediaAccount");
$this->setHydrator(new DoctrineHydrator($objectManager));
$this->setObject(new ContactSocialMediaAccount());
$this->add([
"name" => "URL",
"type" => "Text",
]);
}
И мой ContactForm.php
public function __construct(ObjectManager $objectManager) {
parent::__construct("contactForm");
$this->setHydrator(new DoctrineHydrator($objectManager));
$this->setInputFilter(new InputFilter());
$contactFieldset = new ContactFieldset($objectManager);
$contactFieldset->setUseAsBaseFieldset(true);
$this->add($contactFieldset);
}
Как мне добавить заполнить Entity_ID
в полях SocialMedia.Я добавил это в контактную сущность
/**
* @param SocialMediaAccounts[] $socialMediaAccounts
* @return self
*/
public function setSocialMediaAccounts(array $socialMediaAccounts) {
$this->SocialMediaAccounts = $socialMediaAccounts;
return $this;
}
/**
* @return SocialMediaAccounts[]
*/
public function getSocialMediaAccounts() {
if (!$this->SocialMediaAccounts->count()) {
$accounts = [];
foreach (ContactSocialMediaAccount::getTypes() as $type => $name) {
$account = new ContactSocialMediaAccount;
$account->setSocialMediaID($type);
$this->SocialMediaAccounts->add($account);
}
}
return $this->SocialMediaAccounts;
}
/**
* @param Collection $socialMediaAccounts
*/
public function addSocialMediaAccounts(Collection $socialMediaAccounts) {
foreach ($socialMediaAccounts as $socialMediaAccount) {
$socialMediaAccount->setContact($this);
$this->SocialMediaAccounts->add($socialMediaAccount);
}
}
Кажется, это не сработало.