Symfony以前一种形式

时间:2017-06-08 21:42:25

标签: php entity-framework symfony

我会尽力解释。我为@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;
    }

因为我的外键是空的,我无法验证我的表单......:/ 有人可以帮帮我吗?请

1 个答案:

答案 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。