我在整理一个页面时遇到了一些麻烦,该页面验证并存储了我的电子商务相关网站的cms部分的用户信息。
页面的一部分包含一个选项,供用户选择是否要求帐单邮寄地址与其送货地址不同。这是页面上的两种形式之一。
第一个表单是用户选择是否需要备用帐单邮寄地址的表格。
根据此选择,如果需要,生成第二个表单或者包含额外的帐单地址空间。
以下是与第一种表单相关的html:
<form name="isSameAsPostal" action="" method="post">
<table class="adminTable" align="center">
<thead class="tableAddEdit">
<tr>
<th colspan="4">Details</th>
<th colspan="1">Active</th>
</tr>
</thead>
<tfoot class="tableFooter">
<tr>
<td colspan="5">This table stores the users addittional information.</td>
</tr>
</tfoot>
<tbody>
<tr>
<td colspan="4">User has different billing address?</td>
'.$topCont.'
</tr>
</tbody>
</table>
</form>
正如您所看到的,其自身的输入不包含在表单中,它被应用为在脚本控制器中设置的变量。
以下是将内容置于上下文中的php:
if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
$_SESSION['sameAsPostal'] = 1;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
$_SESSION['sameAsPostal'] = 0;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal and billing';
}
else
{
$_SESSION['sameAsPostal'] = 0;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal and billing';
}
正如您所看到的,javascript用于在输入状态发生变化时自动提交表单。
现在基于此,当我最初开始使用时,一切都能正常运行。
根据控制器,勾选复选框,会话变量$sameAsPostal
设置为“1”,用于触发第二种形式的额外结算选项的生成。
除此之外,复选框的值变为“0”,因此允许取消选中复选框,并删除第二种形式的帐单信息,因为$sameAsPostal
将设置为0,如第二部分所示控制器脚本。包含控制器的最后一部分作为添加到页面的输入的第一个实例。没有它就没有输入。
太棒了,就像我说这一切都有效。但是我现在面临的问题是对此的下一个合理的补充。验证第二个表单并遇到输入错误时,将刷新页面并应用正确的错误突出显示。在此范围内,复选框也会重置,导致结算信息部分消失。 (填充单个输入的信息仍然存储,但是当复选框已经重置时,它的实际html消失了)
所以我尝试了这个添加到控制器:
if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 1)
{
$_SESSION['sameAsPostal'] = 1;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal';
}
else if (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0)
{
$_SESSION['sameAsPostal'] = 0;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal and billing';
}
else if (isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1)
{
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="0" checked="checked" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal';
}
else if ((isset($_SESSION['sameAsPostal']) && $_SESSION['sameAsPostal'] == 1) && (isset($_POST['sameAsPostal']) && $_POST['sameAsPostal'] == 0))
{
$_SESSION['sameAsPostal'] = 0;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal and billing';
}
else
{
$_SESSION['sameAsPostal'] = 0;
$topCont = '<td colspan="1"> <input type="checkbox" name="sameAsPostal" id="sameAsPostal" value="1" onChange="javascript:document.isSameAsPostal.submit();" title="Tick if user has alternate billing information." /> </td>';
$otherCont = 'postal and billing';
}
还有很多其他人说实话......但似乎我的逻辑和这项任务涉及的实际逻辑似乎有所不同。
如果选中此控件,则无法取消选中该复选框。
我添加了会话变量以便在复选框中捕获状态,然后首先将正确的输入应用于第一个表单,然后根据需要生成billng信息部分。
但似乎无论我如何配置控制器脚本,我似乎无法以这种方式解决它。
可以提供一些有关我在哪里出错的信息或提出建议吗?
提前感谢您花时间阅读此内容!
答案 0 :(得分:1)
如果您想使用$_SESSION
变量,则需要确保每次都启动会话,以保存这些值。我将假设您在第一次从$_POST
数组中提交表单后提交了复选框值。
您可以从提交的表单中检查该值,但为了使其与您的问题保持一致,我能想到的是您没有正确启动会话。
顺便说一下,你只需要像这样检查它,因为即使没有设置它也不会破坏你的代码。我觉得你过分复杂了。
if($_SESSION['sameAsPostal'] == 1){
//Do your code for checked
}else{
//Do your code for unchecked
}
总而言之,请确保session_start()
代码中的第一件事,并从提交的表单中获取值(0,1)。要根据变量的值标记一个复选框,您可以执行更简单的操作:
$checked = ($_SESSION['variable'] == 1)?1:0;
echo "<input type='checkbox' value='$checked' title='My checkbox' />";
注意如果您使用AJAX发送表单并且页面从未实际重新加载,那么当然PHP不执行任何其他操作,因为它只执行一次,然后用户才能看到实际页。也许您假设变量客户端的更改会被反映,但除非您重新执行该服务器端代码(刷新页面),否则它不会。