我会尽力解释。我为@manytoone双向关系创建了2个链接实体(我相信^^')。这是我想要做的,我创建了第一个表单,允许我填充第一个实体(女儿实体),然后我根据标准重定向到另一个页面,允许我填充父实体但我找不到一种检索实体女孩的id的方法,我试图通过URL传递它,但我无法检索它并将其插入字段id_daughterentities中。 我附上代码,希望这个解释能让你看得更清楚。
public function newclientAction(Request $request)
{
// On crée un objet Advert
$client = new Clients();
// J'ai raccourci cette partie, car c'est plus rapide à écrire !
$form = $this->get('form.factory')->createBuilder(FormType::class, $client)
->add('FirstName', TextType::class)
->add('Surname', TextType::class)
->add('Address', TextType::class)
->add('Mail', EmailType::class, array(
'required' => false))
->add('Mail2', EmailType::class, array(
'label' => 'Mail N°2',
'required' => false
))
->add('Phone', TextType::class, array(
'required' => false))
->add('Phone2', TextType::class, array('label' => 'Phone N°2',
'required' => false))
->add('BirthDate', BirthdayType::class, array('label' => 'Date of Birth'))
->add('Status', ChoiceType::class, array(
'choices' => array(
'Client' => 'Client',
'Ex-Client' => 'Ex-Client',
'Prospect' => 'Prospect'),
))
->add('Comments', TextareaType::class, array(
'required' => false))
->add('TypeofBuisness', ChoiceType::class, array(
'choices' => array(
'Blank'=> Null,
'SE' => 'SE',
'SA' => 'SE',
'LLP' => 'LTD',
'LTD' => 'LTD',
'Payroll' => 'Payroll'),
'label' => 'Type of buisness'
))
->add('save', SubmitType::class)
->getForm()
;
// Si la requête est en POST
if ($request->isMethod('POST')) {
// On fait le lien Requête <-> Formulaire
// À partir de maintenant, la variable $advert contient les valeurs entrées dans le formulaire par le visiteur
$form->handleRequest($request);
// On vérifie que les valeurs entrées sont correctes
// (Nous verrons la validation des objets en détail dans le prochain chapitre)
if ($form->isValid()) {
// On enregistre notre objet $advert dans la base de données, par exemple
$em = $this->getDoctrine()->getManager();
$em->persist($client);
$em->flush();
$request->getSession()->getFlashBag()->add('notice', 'Well regitered.');
if ($client->getTypeOfBuisness()== 'Payroll')
{
return $this->redirectToRoute('pegasus_payroll', array('id' => $client->getId()));
}
elseif ($client->getTypeOfBuisness()== 'LTD')
{
return $this->redirectToRoute('pegasus_ltd', array('id' => $client->getId()));
}
elseif ($client->getTypeOfBuisness()== 'LTD')
{
return $this->redirectToRoute('pegasus_se', array('id' => $client->getId()));
}
else {
return $this->redirectToRoute('pegasus_web_homepage', array('id' => $client->getId()));
}
}
}
// À ce stade, le formulaire n'est pas valide car :
// - Soit la requête est de type GET, donc le visiteur vient d'arriver sur la page et veut voir le formulaire
// - Soit la requête est de type POST, mais le formulaire contient des valeurs invalides, donc on l'affiche de nouveau
return $this->render('PegasusWebBundle:Default:newclient.html.twig', array(
'form' => $form->createView(),
));
}
public function payrollAction(Request $request)
{
// On crée un objet Advert
$payroll = new Payroll();
// J'ai raccourci cette partie, car c'est plus rapide à écrire !
$form = $this->get('form.factory')->createBuilder(FormType::class, $payroll)
->add('EmployerName', TextType::class, array('label' => 'Employer name'))
->add('EmployerSurname', TextType::class)
->add('Address', TextType::class, array('required' => false))
->add('Phone', TextType::class, array('required' => false))
->add('Phone2', TextType::class, array('label' => 'Phone N°2','required'=> false))
->add('Mail', EmailType::class, array('required' => false))
->add('Mail2', EmailType::class, array('label' => 'Mail N°2','required'=> false ))
->add('ContactName', TextType::class, array('required' => false))
->add('Payedisctrict', TextType::class, array('label' => 'PAYE district','required'=> false))
->add('Payeaddress', TextType::class, array('label' => 'PAYE address','required'=> false))
->add('Payephone', TextType::class, array('label' => 'PAYE phone','required'=> false))
->add('Payereference', TextType::class, array('label' => 'PAYE reference','required'=> false))
->add('Accref', TextType::class, array('label' => 'Account reference','required'=> false))
->add('Taxereff', TextType::class, array('label' => 'Tax reference','required'=> false))
->add('Comments', TextareaType::class, array('label' => 'Any comment ?','required'=> false))
->add('save', SubmitType::class)
->getForm()
;
我尝试从网址获取id,但它不起作用,我尝试了解决方案的音调,但没有任何作用......我真的很抱歉这个愚蠢的问题,但我正在尝试自己学习
$payroll.clients=$request->query->get('id');
// Si la requête est en POST
if ($request->isMethod('POST')) {
// On fait le lien Requête <-> Formulaire
// À partir de maintenant, la variable $advert contient les valeurs entrées dans le formulaire par le visiteur
$form->handleRequest($request);
$payroll->is
// On vérifie que les valeurs entrées sont correctes
// (Nous verrons la validation des objets en détail dans le prochain chapitre)
if ($form->isValid()) {
// On enregistre notre objet $advert dans la base de données, par exemple
$em = $this->getDoctrine()->getManager();
$em->persist($payroll);
$em->flush();
$request->getSession()->getFlashBag()->add('notice', 'Well regitered.');
return $this->redirectToRoute('pegasus_web_homepage');
}
}
// À ce stade, le formulaire n'est pas valide car :
// - Soit la requête est de type GET, donc le visiteur vient d'arriver sur la page et veut voir le formulaire
// - Soit la requête est de type POST, mais le formulaire contient des valeurs invalides, donc on l'affiche de nouveau
return $this->render('PegasusWebBundle:Default:newclient.html.twig', array(
'form' => $form->createView(),
));
}
/**
* Payroll
*
* @ORM\Table(name="payroll")
* @ORM\Entity(repositoryClass="Pegasus\WebBundle\Repository\PayrollRepository")
*/
class Payroll
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Clients", inversedBy="payroll")
* @ORM\JoinColumn(nullable=false, name="clients_id", referencedColumnName="id")
*/
private $clients;
/**
* Set clients
*
* @param \Pegasus\WebBundle\Entity\Clients $clients
*
* @return Payroll
*/
public function setClients(\Pegasus\WebBundle\Entity\Clients $clients )
{
$this->clients = $clients;
return $this;
}
/**
* Get clients
*
* @return \Pegasus\WebBundle\Entity\Clients
*/
public function getClients()
{
return $this->clients;
}
因为我的外键是空的,我无法验证我的表单......:/ 有人可以帮帮我吗?请
答案 0 :(得分:0)
首先,您需要Clients
Entity对象来保留doctrine实体,而不是整数ID。如果要在请求中传递id,则需要使用自动依赖注入,或者手动从doctrine获取实体,如下所示:
$clients = $this->getDoctrine()->getManager()
->find('PegasusWebBundle:Clients', $request->query->get('id'));
下一期是您的工资表。需要了解Payroll
实体(data_class
选项)和Clients
EntityType
关联,即使客户端是隐藏字段也是如此。虽然在您的示例中不清楚如何将表单数据传递给new Payroll
实体对象。
例如,使用单独的GET和POST操作。
/**
* @Route("/pegasus_payroll/{id}", name="pegasus_payroll", requirements={"id":"\d+"})
* @Method("GET")
*/
public function payrollAction(Request $request, \Pegasus\WebBundle\Entity\Clients $clients)
{
$payroll = new Payroll();
//set the new payroll clients based on the automatic param conversion
$payroll->setClients($clients);
$form = $this->createPayrollForm($payroll, ['action' => $this->generateUrl('save_pegasus_payroll')]);
$form->handleRequest($request);
return $this->render('PegasusWebBundle:Default:newpayroll.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/pegasus_payroll", name="save_pegasus_payroll")
* @Method("POST")
*/
public function savePayrollAction(Request $request)
{
//retrieve the entity from the request form data, to validate with the previous form choice(s).
$em = $this->getDoctrine()->getManager();
$clients = $em->find('PegasusWebBundle:Clients', $request->request->get('form')['clients']);
$payroll = new Payroll;
$payroll->setClients($clients);
$form = $this->createPayrollForm($payroll);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$formPayroll = $form->getData();
echo $formPayroll->getClients()->getId();
//the form data is propagated to the $payroll object passed to it
echo $payroll->getClients()->getId();
exit;
//$em->persist($payroll);
//$em->flush();
//$this->addFlash('notice', 'Well regitered.');
//return $this->redirectToRoute('pegasus_web_homepage');
}
return $this->render('PegasusWebBundle:Default:newpayroll.html.twig', [
'form' => $form->createView(),
]);
}
/**
* use a method to store the form so you can use it elsewhere
* Alternatively create a new FormType class that extends AbstractFormType
*/
private function createPayrollForm(Payroll $payroll, array $options = [])
{
$options['data_class'] = Payroll::class;
return $this->get('form.factory')
->createBuilder(FormType::class, $payroll, $options)
//.. you will need to update to match the Payroll entity property name getter/setters names.
->add('clients', EntityType::class, [
'class' => \Pegasus\WebBundle\Entity\Clients::class,
'multiple' => false, //only a single selection
'label' => false, //don't display the form field label
'choice_label' => false, //don't display select options
'choices' => [$payroll->getClients()], //only available choice
'attr' => [
'style' => 'display:none;' //hide the select box
]
])
->getForm();
}
最后请注意,您应该使用ParamConverter的自动依赖注入 当你的控制器有类型暗示他们需要的东西时,它会让你的生活变得更容易,而不是必须手动定义evertything。