stack:symfony2 / doctrine2 / php / mysql
两个步骤的多页形式。每一步都是在控制器动作中实现的。
步骤1中的,显示表单。 form-input在同一个动作中得到验证。如果表单有效,则应将用户重定向到第二步/操作。在第二步中,用户必须确认他的输入。确认后,数据应存储在数据库中。
因此,在第二步/动作中需要形式实体/形式数据。但是我不想在确认之前将它存储在数据库中。我真的需要序列化所有对象吗?到会议? 有更好的方法吗?
有什么建议吗?
答案 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
。临时收集在一小时之后被一个以低优先级运行的加载收集器删除。
我喜欢第二种解决方案,因为用户必须确认已经存储在数据库中的最终取消。如果前端不能按预期工作,用户可能会注意到已取消的损坏(例如选择了错误的条目)。如果他确认,只有国家改变了。感觉安全。在第一个解决方案中,用户确认应该存储在数据库中的内容,但直到现在还没有。感到不安全。