Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 实体实例的多个表单-symfony3_Php_Forms_Doctrine Orm_Symfony 3.2 - Fatal编程技术网

Php 实体实例的多个表单-symfony3

Php 实体实例的多个表单-symfony3,php,forms,doctrine-orm,symfony-3.2,Php,Forms,Doctrine Orm,Symfony 3.2,我正在尝试创建一个表单,允许经理批准休假请求列表(还计划有一个待办事项列表,并希望能够将其标记为已完成) 我已经阅读了[(以及其他几篇),我已经接近了解,但我对Symfony还比较陌生,不清楚代码的哪些部分应该放在哪些文件中。我在Symfony3中使用了一个表单类型和一个控制器,并带有条令 我有从控制器中的查询($em->createQuery)返回的实体实例列表,我希望为每个实体实例生成一个表单,甚至为每个实体生成两个表单(一个用于批准,一个用于拒绝) 引用的问题说您需要一个循环来显示和保存它

我正在尝试创建一个表单,允许经理批准休假请求列表(还计划有一个待办事项列表,并希望能够将其标记为已完成)

我已经阅读了[(以及其他几篇),我已经接近了解,但我对Symfony还比较陌生,不清楚代码的哪些部分应该放在哪些文件中。我在Symfony3中使用了一个表单类型和一个控制器,并带有条令

我有从控制器中的查询($em->createQuery)返回的实体实例列表,我希望为每个实体实例生成一个表单,甚至为每个实体生成两个表单(一个用于批准,一个用于拒绝)

引用的问题说您需要一个循环来显示和保存它们。我的目的是一次只处理(提交)一个。我假设这部分代码将进入控制器

我正在为控制器使用索引操作,但使用它更像是编辑操作,因为我将处理表单,所以我传入一个请求对象和对象作为参数

>

如果我单击“拒绝”按钮。如果我单击“批准”按钮,我会得到一个与“批准”类似的表单,因此看起来我很接近。此外,在操作中给出的路线上会显示正确的ID

以下是表单生成器:

<?php

namespace CockpitBundle\Form;


use CockpitBundle\Entity\Employee;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class TORApprovalType extends AbstractType
{

    private $nameSuffix = null;
    private $name = 'time_req_approval';
    public function __constructor(string $suffix = null)   {
        //parent::__construct();

        $this->nameSuffix = $this->generateNameSuffix();
    }

    private function generateNameSuffix() {
        if ($this->nameSuffix == null ||  $this->nameSuffix == '') {
            $generator = new SecureRandom();
            //change data to alphanumeric string
            return bin2hex($generator->nextBytes(10));
        }

        return $this->nameSuffix;
    }
    public function setNameSuffix($suffix){
        $this->nameSuffix = $suffix;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Build your form...
        $builder->add('approve', SubmitType::class, array(
            'label' => "Approve",
            'attr' => array("class"=>"action-approve"),
        ));
        $builder->add('reject', SubmitType::class, array(
            'label' => "Reject",
            'attr' => array("class"=>"action-reject"),
        ));
        //$builder->add('employee');

    }
    public function getName()    {
        if ($this->nameSuffix == null || $this->nameSuffix == "" ) {
            $this->nameSuffix = $this->generateNameSuffix();
        }
        return $this->name .'_'. $this->nameSuffix;
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'CockpitBundle\Entity\TimeOffRequest'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'cockpitbundle_timeoffrequest';
    }


}

您可以执行多个提交按钮:检查表单类型

    ->add('approve', 'submit')
    ->add('reject', 'submit')
然后在你的控制器里

 if ($form->isValid()) {
        // ... do something

        // the save_and_add button was clicked
        if ($form->get('approve')->isClicked()) {
            // probably redirect to the add page again
        }
        if ($form->get('reject')->isClicked()) {
            // probably redirect to the add page again
        }

        // redirect to the show page for the just submitted item
    }

您可以执行多个提交按钮:检查表单类型

    ->add('approve', 'submit')
    ->add('reject', 'submit')
然后在你的控制器里

 if ($form->isValid()) {
        // ... do something

        // the save_and_add button was clicked
        if ($form->get('approve')->isClicked()) {
            // probably redirect to the add page again
        }
        if ($form->get('reject')->isClicked()) {
            // probably redirect to the add page again
        }

        // redirect to the show page for the just submitted item
    }

我能够让它与以下构建器一起工作

   $builder->add('approve', SubmitType::class, array(
        'label' => "Approve",
        'attr' => array("class"=>"action-approve"),
    ));
    $builder->add('reject', SubmitType::class, array(
        'label' => "Reject",
        'attr' => array("class"=>"action-reject"),
    ));
然后在控制器表单中,我生成并处理表单。不确定这是否是最佳方式,但它可以找到。当然,这种方法每次都会重新绘制整个列表,但这对于我正在做的事情来说是很好的

class HRMgrController extends Controller
{
    /**
     * Lists all manager role requests and provide a means to approve/deny.
     *
     * @Route("/", name="manager_home")
     * @Method({"GET"})
     * @Security("has_role('ROLE_APP_MANAGER')")
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();
        $emp = new \CockpitBundle\Entity\Employee();
        $employeeSummary = [];
        $date = new \DateTime();
        $year = $date->format('Y');
        $username = $this->getUser()->getUserName();
        $user = $em->getRepository('CockpitBundle:Employee')->findByUsername($username);
        $myemployees = $em->getRepository('CockpitBundle:Employee')->findManagersEmployees($user);
        $torRep = $em->getRepository('CockpitBundle:TimeOffRequest');
        $toas = [];
        $torforms = [];
        foreach ($myemployees as $employee) {
            $tors = $torRep->findAllMine($employee,$year);
            $toas[$employee->getDisplayName()] = $em->getRepository('CockpitBundle:TimeOffAllocation')->getEmpAllocation($employee->getId(),$year);
            $employeeSummary[$employee->getDisplayName()] = $torRep->mySummary($tors,$toas[$employee->getDisplayName()]);
            if (array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Vacation']['Requested'])) {
                foreach ($employeeSummary[$employee->getDisplayName()]['Vacation']['Requested']['items'] as $tor) {
                    $target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
                    $torforms[] = $this->actionForm($tor,$target)->createView();
                }
            }
            if (array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Sick Time']['Requested'])) {
                foreach ($employeeSummary[$employee->getDisplayName()]['Sick Time']['Requested']['items'] as $tor) {
                    $target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
                    $torforms[] = $this->actionForm($tor,$target)->createView();
                }
            }
            if (array_key_exists('Time Off',$employeeSummary[$employee->getDisplayName()]) && 
                    array_key_exists('items',$employeeSummary[$employee->getDisplayName()]['Time Off']['Requested'])) {
                foreach ($employeeSummary[$employee->getDisplayName()]['Time Off']['Requested']['items'] as $tor) {
                    $target = $this->generateUrl('hrmgr_tor_approval',array("tor_id" => $tor->getId()));
                    $torforms[] = $this->actionForm($tor,$target)->createView();
                }
            }
        }

        return $this->render('hrmgr/index.html.twig', array(
            'employeeSummary' => $employeeSummary,
            'torforms' => $torforms,
            'year' => $year,
        ));
    }
    /**
     * Lists all manager role requests and provide a means to approve/deny.
     *
     * @Route("/{tor_id}", name="hrmgr_tor_approval")
     * @Method({ "POST" })
     * @ParamConverter("timeOffRequest", class="CockpitBundle:TimeOffRequest", options={"id"="tor_id"})
     * @Security("has_role('ROLE_APP_MANAGER')")
     */
    public function approvalAction(Request $request, TimeOffRequest $timeOffRequest)
    {
        if (!empty($timeOffRequest)) {
            $form = $this->createForm('CockpitBundle\Form\TORApprovalType', $timeOffRequest);
            $id = $timeOffRequest->getId();
            $em = $this->getDoctrine()->getManager();
            $form->handleRequest($request);
            $postparams = $request->request->all();

            if (array_key_exists("approval_form_$id",$postparams)) {
                // Form was submitted
                if (array_key_exists("approve",$postparams["approval_form_$id"])) {
                    $status = $em->getReference('CockpitBundle\Entity\TimeOffStatus', 4);
                    $timeOffRequest->setStatus($status);
                    $timeOffRequest->setApprovedDate(new \DateTime);
                    $em->persist($timeOffRequest);
                    $em->flush($timeOffRequest);
                }
                if (array_key_exists("reject",$postparams["approval_form_$id"])) {
                    $status = $em->getReference('CockpitBundle\Entity\TimeOffStatus', 1);
                    $timeOffRequest->setStatus($status);
                    $timeOffRequest->setApprovedDate(new \DateTime);
                    $em->persist($timeOffRequest);
                    $em->flush($timeOffRequest);
                }
            } else {
                print "Form did not exist<BR>";
            }
            return $this->redirectToRoute('manager_home');
        } 
    }
    public function actionForm($tor,$target) {
        return $this->get('form.factory')->createNamedBuilder('approval_form_'.$tor->getId(), \CockpitBundle\Form\TORApprovalType::class, $tor,
             array("action"=> $target))->getForm();        
    }
}
类HRMGR控制器扩展控制器
{
/**
*列出所有经理角色请求,并提供批准/拒绝的方法。
*
*@Route(“/”,name=“manager\u home”)
*@Method({“GET”})
*@Security(“has_role('role_APP_MANAGER'))
*/
公共函数索引()
{
$em=$this->getDoctrine()->getManager();
$emp=new\CockpitBundle\Entity\Employee();
$employeeSummary=[];
$date=new\DateTime();
$year=$date->format('Y');
$username=$this->getUser()->getUserName();
$user=$em->getRepository('CockpitBundle:Employee')->findByUsername($username);
$myemployees=$em->getRepository('CockpitBundle:Employee')->FindManagerEmployees($user);
$torRep=$em->getRepository('CockpitBundle:TimeOffRequest');
$toas=[];
$torforms=[];
foreach($myemployees作为$employee){
$tors=$torRep->findAllMine($employee,$year);
$toas[$employee->getDisplayName()]=$em->getRepository('CockpitBundle:TimeOffAllocation')->getEmployee->getId(),$year);
$employeeSummary[$employee->getDisplayName()]=$torRep->mySummary($tors,$toas[$employee->getDisplayName()]);
如果(数组_key_存在('items',$employeeSummary[$employee->getDisplayName()]['Vacation']['Requested'])){
foreach($employeeSummary[$employee->getDisplayName()]['休假]['Requested']['items']作为$tor){
$target=$this->generateUrl('hrmgr\u tor\u approval',数组(“tor\u id”=>$tor->getId());
$torforms[]=$this->actionForm($tor,$target)->createView();
}
}
如果(数组_key_存在('items',$employeeSummary[$employee->getDisplayName()]['Sick Time']['Requested'])){
foreach($employeeSummary[$employee->getDisplayName()]['病假]['Requested']['items']作为$tor){
$target=$this->generateUrl('hrmgr\u tor\u approval',数组(“tor\u id”=>$tor->getId());
$torforms[]=$this->actionForm($tor,$target)->createView();
}
}
如果(array_key_存在('Time Off',$employeeSummary[$employee->getDisplayName()])&&
数组_key_存在('items',$employeeSummary[$employee->getDisplayName()]['Time Off']['Requested'])){
foreach($employeeSummary[$employee->getDisplayName()]['Time Off']['Requested']['items']作为$tor){
$target=$this->generateUrl('hrmgr\u tor\u approval',数组(“tor\u id”=>$tor->getId());
$torforms[]=$this->actionForm($tor,$target)->createView();
}
}
}
返回$this->render('hrmgr/index.html.twig',数组(
“employeeSummary”=>$employeeSummary,
“torforms”=>$torforms,
“年”=>$year,
));
}
/**
*列出所有经理角色请求,并提供批准/拒绝的方法。
*
*@Route(“/{tor_id}”,name=“hrmgr_tor_批准”)
*@Method({“POST”})
*@ParamConverter(“timeOffRequest”,class=“CockpitBundle:timeOffRequest”,options={“id”=“toru id”})
*@Security(“has_role('role_APP_MANAGER'))
*/
公共功能批准操作(请求$Request,TimeOffRequest$TimeOffRequest)
{
如果(!empty($timeOffRequest)){
$form=$this->createForm('CockpitBundle\form\TORApprovalType',$timeOffRequest);
$id=$timeOffRequest->getId();
$em=$this->getDoctrine()->getManager();
$form->handleRequest($request);
$postparams=$request->request->all();
如果(数组\键\存在(“批准\表格\ id”、$postparams)){
//表格已提交
如果(数组\键\存在(“批准”、$postparams[“批准\表格\ id”])){
$status=$em->getReference('CockpitBundle\Entity\TimeOffStatus',4);
$timeOffRequest->setStatus($status);
$timeOffRequest->setApprovedDate(新建\DateTime);
$em->persist($timeOffRequest);
$em->flush($timeOffRequest);
}
如果