symfony2:多页表单 - 传递实体

时间:2013-06-26 11:55:18

标签: php symfony serialization doctrine

stack:symfony2 / doctrine2 / php / mysql

两个步骤的多页形式。每一步都是在控制器动作中实现的。

步骤1中的

,显示表单。 form-input在同一个动作中得到验证。如果表单有效,则应将用户重定向到第二步/操作。在第二步中,用户必须确认他的输入。确认后,数据应存储在数据库中。

因此,在第二步/动作中需要形式实体/形式数据。但是我不想在确认之前将它存储在数据库中。

我真的需要序列化所有对象吗?到会议? 有更好的方法吗?

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

首先,我建议在发布之前通过JavaScript验证输入,而不是在服务器上的控制器操作中验证。

如果你不想将数据序列化到会话中,你可以在第一个动作中收到数据时将其传递到下一页,然后将其发布到第二个动作,我想象这样的事情:

firstAction() {
  $exampleData = $_POST['exampleData'];
  // Do whatever you need, then pass the data on to the next page
  return $this->render('SomeBundle:Views:secondPage.html.php',
                       array('exampleData' => $exampleData));

在第二页上,您只需使用JavaScript访问$ exampleData,最好将其放在表单内的一些隐藏输入字段中。

<!-- secondPage.html.php -->
<script type="text/javascript">
    var exampleData = <?php echo $exampleData ?>;
    $('#hiddenInput').val(exampleData);
</script>

第二个控制器动作将接收$ exampleData,而不会在会话中序列化。

很抱歉,如果有任何语法错误,暂时没有使用symfony2:)

答案 1 :(得分:1)

尝试使用序列化,但实体非常复杂,很多&#34;关联。因此序列化太慢了。即使在分离之后。

第一个解决方案(简化):

将POST变量存储到第一步/操作中的会话中。

    $postParams = $this->getRequest()->request;

    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }
    $session->set($sessionKey, $postParams);

在第二步/动作中,我使用表格来重新填充我的实体。

    $cancellation = $manager->initCancellationSomehow();

    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }

    $parameterBag = $session->get($sessionKey);

    $cancellation = $this->getCancellation($customerId);

    $form = $this->createForm(
        new CancellationType(),
        $cancellation,
        array(
            'em' => $this->getDoctrine()->getManager())
    );

    $form->bind($parameterBag->get('form'));

    [..]

第二个解决方案:

我的第一个想法是在数据库中存储取消。因此我添加了一个州属性(active / temp / ..)。未经证实的取消标记为temp。如果用户确认状态从temp更改为active。临时收集在一小时之后被一个以低优先级运行的加载收集器删除。

我喜欢第二种解决方案,因为用户必须确认已经存储在数据库中的最终取消。如果前端不能按预期工作,用户可能会注意到已取消的损坏(例如选择了错误的条目)。如果他确认,只有国家改变了。感觉安全。在第一个解决方案中,用户确认应该存储在数据库中的内容,但直到现在还没有。感到不安全。