Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.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 这是处理两页表格的正确方法吗?_Php_Forms_Design Patterns_Symfony - Fatal编程技术网

Php 这是处理两页表格的正确方法吗?

Php 这是处理两页表格的正确方法吗?,php,forms,design-patterns,symfony,Php,Forms,Design Patterns,Symfony,我有一个索引页面,其中包含一个简单的表单;如果表单验证失败,则重新加载索引页面,如果没有,则与页面相关的操作将请求转发给与页面成功相关的另一个操作。success页面使用提交的表单从DB创建列表。一旦进入success页面,我们就有了另一个类似于第一个表单的表单,用户可以使用它修改页面上的列表。两个表单都有相同的字段 索引页操作: class DefaultController extends Controller { /** * @Route("/", name="homepage")

我有一个
索引
页面,其中包含一个简单的表单;如果表单验证失败,则重新加载索引页面,如果没有,则与页面相关的操作将请求转发给与页面
成功
相关的另一个操作。
success
页面使用提交的表单从DB创建列表。一旦进入
success
页面,我们就有了另一个类似于第一个表单的表单,用户可以使用它修改页面上的列表。两个表单都有相同的字段

  • 索引页操作:

    class DefaultController extends Controller {
    
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request) {
    
        $event = new Event();
        $form = $this->createForm(EventForm::class, $event);
        $form->handleRequest($request);
    
       if($form->isSubmitted() && $form->isValid()) {
    
            // Do some minor modification to the form data
            $event->setDate($party->getDate()->modify('+12 hours'));
            $cityName = strtolower($event->getPlace()['city']);
    
            // We know the form data is valid, forward it to the action which will use it to query DB
           return $this->forward('AppBundle:Frontend/Default:eventsList', array('request' => $request));
    
        }
    // If validation fails, reload the index page with the errors
    return $this->render('default/frontend/index.html.twig', array('form' => $form->createView()));
    }
    
  • 成功页面操作(转发表单数据的位置)

尽管上述实施“有效”,但我有几个问题:

  • 当我提交第一个表单时,url保持不变,第一个页面的url如下:

    [HOST]/app_dev.php?place=London&Date=

  • 但如果我提交第二个表单,URL是正确的: [HOST]/app_dev.php/success?place=London&date=

  • 对我来说,实现起来很麻烦,有没有更干净的方法来实现这一点

  • 提交表单时,将使用相同的控制器和操作进行处理。您必须处理提交的数据,然后重定向到成功页面

    在你的例子中:

    if($form->isSubmitted()&&&$form->isValid()){
    ...
    ...
    返回$this->redirectToRoute('eventList');
    }

    如果您需要将发布的数据从一个“页面”传输到另一个“页面”,则必须将其存储在会话
    $this->get('session')->set('name',val)中$this->get('session')->get('name')从eventList操作中的会话检索数据


    有关如何在Symfony中处理会话的详细信息:

    提交表单时,将使用相同的控制器和操作进行处理。您必须处理提交的数据,然后重定向到成功页面

    在你的例子中:

    if($form->isSubmitted()&&&$form->isValid()){
    ...
    ...
    返回$this->redirectToRoute('eventList');
    }

    如果您需要将发布的数据从一个“页面”传输到另一个“页面”,则必须将其存储在会话
    $this->get('session')->set('name',val)中$this->get('session')->get('name')从eventList操作中的会话检索数据

    有关如何在Symfony中处理会话的详细信息:

     /**
      * @Route("/success", name="eventList")
      */
     public function eventsListAction(Request $request) {
     $event = new Party();
     // Create a form in the second page and set its action to be the first page, otherwise form submition triggers the FIRST action related to page index and not the one related to page success
     $form = $this->createForm(EventForm::class, $event, array('action' => $this->generateUrl('eventList')));
     $form->handleRequest($request);
    
     if($form->isSubmitted() && $form->isValid()) {
        $event->setPlace($form["place"]->getData());
        $event->setTitle($form["title"]->getData());
    
        $repository = $this->getDoctrine()
            ->getRepository('AppBundle:Event');
    
        // ....
        // Create a list of events using the data from DB
        // ....
    
        return $this->render('default/frontend/success.html.twig',
            array('events' => $events, 'form' => $form->createView())
        );
    }
    
    return $this->render('default/frontend/success.html.twig', array('form' => $form->createView()));
    }