在这里完成PHP新手,几乎我以前的所有工作都在ASP.NET中。我现在正在研究一个PHP项目,我偶然发现的第一个摇滚是在回发中保留价值。
对于最简单但仍然现实的例子,我有10个下拉菜单。它们甚至还没有数据包,因为这是我的下一步。它们是简单的下拉列表。
我的整个页面都包含在标签中。每个下拉列表的onclick()事件,调用一个javascript函数,该函数将填充相应的下拉列表隐藏元素,并选择下拉列表值。然后,在页面重新加载时,如果该隐藏值不为空,我设置所选选项=我隐藏的选项。
这适用于单个回发。但是,当另一个下拉列表发生变化时,原始的第1个下拉列表会失去其值,因为其相应的隐藏值也会失去其价值!
这使我开始研究使用查询字符串或会话,或者......其他一些想法。
有人能指出我正确的方向,在我的情况下哪个选项最好?我是一个PHP新手,但是我被要求为我的技能水平做一些非常激烈的事情,所以我需要一些灵活的东西,并且更容易使用。
谢谢!
- - - - - - - - 编辑
对我的问题稍微澄清一下:)
当我说'PostBack'时,我指的是提交的页面/表单。控件将传回服务器,并再次执行HTML / PHP代码。
关于下拉菜单& hiddens,我使用隐藏变量保留“选定值”或“选定索引”的原因是,当提交页面时,我能够使用之前的选择重绘下拉列表,而不是默认返回第一个索引。当我使用$ _POST []命令时,我无法按名称检索下拉列表,但我可以按名称检索隐藏值。这就是为什么在下拉更改事件时,我调用javascript将下拉列表中的选定值设置为其隐藏的相应值。
--------再次编辑-------- 好吧好吧,我看到我需要退步并解释整体目标:)我很抱歉开始时不是很清楚。
我的最终设计将是一个页面,用户可以在该页面中选择我们公司内的部门来查看数据。一旦选择了该部门(从下拉列表中),我将显示更具体的数据选择下拉列表:颜色,大小,供应商,样式,日期,商店#等...此时我还将显示销售数据选定的部门。在选择任何颜色,尺寸等时,我将更新销售数据结果以满足新标准
---------编辑---------- 我无法提供对我的示例的外部访问,但是这里是一个带有探索的sceenshot。在下图中,用户将展开“部门”下拉列表,以选择一个部门。此时,下面的销售数据将根据该部门刷新。然后,用户将选择“分组依据”选项,例如商店,页面/数据将刷新以显示按商店分组的数据。然后他们可以在我的示例中选择一种颜色,例如黑色,数据将显示所选部门和颜色的销售额,按商店分组。
为了完成所有这些操作,页面需要在每次刷新/发布时保留部门,颜色和分组下拉选项......
答案 0 :(得分:4)
自动回发没有本地方法,你必须像这样回显$ _POST数组中的数据:
<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" />
另一种方法是创建一个表单助手,为您动态创建输入等,然后检查post数组中的键,例如:
class FormHelper
{
public function input($name,$type = "text",$default_value = "",$postback = false)
{
return '<input name="' . $name . '" type="' . $type . 'value="' . $this->_postback($name,$default_value ) . '" />';
}
//More Methods
private function _postback($key,$default = "")
{
return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default;
}
}
然后你可以添加将能够构建表单,指定它应该包含以前的值。
你会创建这样的表格:
<form>
<?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?>
</form>
很有可能创建单例方法getInstance()
一些可能对您有用的链接。
更新后,我可能知道您的意思,甚至认为您的帖子很难理解。
如果我正确你想要做以下事情:
如果以上是正确的,那么这不是PHP的特定功能,但主要基于javascript
完成上述操作的最佳方法是确保您的应用程序是基于模板的,因此在您的初始页面加载中,您将显示如下表单:
<html>
<!-- Head, Meta, Etc-->
<body>
<?php $this->template->load("templates/forms/specific_form.php"); ?>
</body>
</html>
这通常是我们加载页面的方式,然后点击你想通过ajax提交表单,我会为此合并jQuery。
表格如下:
<form rel="__postback" ... >
</form>
然后在jQuery中,您将执行以下操作:
$(document).ready(function(){
$("form[rel*=__postback]").each(function(){
var Form = $(this);
//Send the form with ajax, bin the __PostbackComplete()
function __PostbackComplete(server_data)
{
//Overwite the form using jQuery LIVE!!!!
}
});
});
在PHP中,您将分析数据并从模板部分处理表单。
希望这会有所帮助。
答案 1 :(得分:0)
如果我的问题正确,我认为问题实际上是你的javascript解决方案。
为什么只发送所选字段?有多种形式吗?我的意思是,如果所有下拉列表只在一个表单内,您应该在输入更改时发送完整表单,是的,您将再次发送上一个下拉值,但这是使用$ _POST获取该值的方法。
答案 2 :(得分:0)
听起来您只需要重新输出表单字段,并预先填充正确的值。
例如,假设你想要一个这样的下拉列表:
<select name="department">
<option value="s">Sales</option>
<option value="m">Marketing</option>
</select>
当您提交表单时,该值将作为$ _POST [“department”]提供给PHP。现在,您希望再次输出表单,并选择正确的部门。
你需要这样的功能(这只是一个快速草图):
function outputSelect($name, $values, $currentValue) {
echo '<select name="'.htmlspecialchars($name).'">';
foreach ($values as $value => $text) {
if ($value === $currentValue) {
echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>';
} else {
echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>';
}
}
echo '</select>';
}
当您想要显示菜单时,您可以调用它。通常这是来自HTML模板:
<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?>
对于文本字段,隐藏字段,单选按钮等,您将需要类似的功能。最后,您将最终得到一个可重用函数库,用于输出表单字段。
不要忘记在任何HTML标记的属性或内容周围使用htmlspecialchars,如上所述。这在显示用户输入的数据时尤为重要,以防止XSS攻击,但无论数据来源如何,都应该这样做。